Known Findings by Release¶
The integration suite is intentionally strict. Findings are recorded here rather than being marked as passing or silently skipped when the affected test is selected.
Each entry names the release it was observed on, the test that observes it, and the state of the fix. A finding is removed when the source under test passes the test that found it.
dbwarden 0.19.0¶
Tested against the local ../dbwarden checkout, which the lockfile resolves
through [tool.uv.sources].
Resolved from 0.17.1¶
- SQLite emits table constraints inside
CREATE TABLE. Declareduniquesandchecksare applied and enforced by the server.suites/semantics/test_constraint_semantics.pypasses on SQLite and on the real-server matrix. - A foreign key no longer blocks generation on SQLite.
make-migrationsandmigratecomplete. - Configuration-declared objects are diffed against the live snapshot.
suites/plugin_integration/test_pgsql_rbac_roles.pycreates, alters, and undeclares a role without the secondmigratefailing withalready exists. - Reverse-engineered models import
func. Generated files load. - MySQL and MariaDB integer primary keys are
AUTO_INCREMENT. Migrations apply and inserts that omit the key succeed intest_constraints_are_enforced_on_real_servers. - MariaDB creates a valid lock table. The v2 lock DDL fell back to the
SQLite templates because
mariadbwas not a dictionary key, somigratefailed withBLOB/TEXT column 'namespace' used in key specification without a key length. Fixed in the checkout by aliasing the MariaDB templates to MySQL's. Observed bytest_constraints_are_enforced_on_real_servers[mariadb-11.4].
Open¶
None. The findings below were fixed in the checkout and their tests pass:
- A PostgreSQL identity column also rendered as
SERIAL. A model declaringpg.field(identity="always")on an integer primary key emittedid SERIAL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, which PostgreSQL rejects withboth default and identity specified._postgres_serial_typenow hands the base integer type back when the column carries identity metadata. Verified bytest_postgresql_identity_and_index_sort_round_trip. - MySQL and MariaDB convergence failed on a length-less
varchar. The snapshot stores the base type and length separately, and the MySQL column definition builder received the bare base type._snapshot_type_sqlreattaches the length, and inherited charset/collation no longer counts as a difference. Verified bytest_declared_database_versions_complete_a_round_tripfor MySQL 8.0/8.4 and MariaDB 10.11/11.4, and bytest_relational_backend_evolution_rolls_back_and_reapplies. - The last migration of a MySQL/MariaDB run was not recorded. Each DDL
statement implicitly commits and the bookkeeping
INSERTopened a transaction nothing committed, so a two-migration run showed only the first inhistoryand re-applying failed withDuplicate column name. The run now commits after recording. Verified bytest_relational_backend_evolution_rolls_back_and_reapplies. - PostgreSQL index sort options were never captured.
generate-modelsand the snapshot extractor calledpg_index_column_has_propertywith a 0-based key for a 1-based function, so every index reported no sorting. NULLS NOT DISTINCTwas appended afterWHERE. PostgreSQL expects it beforeINCLUDE/WHERE, so the DDL failed to parse.pg_storage_params, columnCOLLATE, andCOMPRESSIONwere dropped. The model spec excluded them frompg_tableand the generator never emitted them. Verified bytest_postgresql_advanced_indexes_and_table_props_round_trip.
dbwarden 0.17.1 (superseded)¶
Observed with dbwarden==0.17.1 installed from PyPI. All findings below are
fixed in 0.19.0; the entries are retained as the historical record of what
the release boundary caught.
- Table constraints are rendered with PostgreSQL syntax on SQLite. A model
declaring
uniquesorchecksgeneratesALTER TABLE branches ADD CONSTRAINT uq_branches_code UNIQUE (code), which SQLite cannot parse.migratefails withnear "UNIQUE": syntax error, so the schema cannot be created at all. Observed bysuites/semantics/test_constraint_semantics.py. The core checkout emits the constraints insideCREATE TABLE. - A foreign key blocks generation on SQLite. A model with a
ForeignKeycolumn fails duringmake-migrationswithRollbackContractError: Placeholder rollback for add_foreign_key on <table> is not allowed. The core checkout emits the reference insideCREATE TABLEand applies cleanly. - Configuration-declared objects are recreated on every migration. The
PostgreSQL preamble - roles, domains, sequences, functions, triggers,
composite types, extended statistics, event triggers, default privileges - is
diffed against a hardcoded empty snapshot instead of the database, so every
declared object reads as new on every run. Applying the second migration
fails with
role "..." already exists, and changing an attribute emitsCREATE ROLEwhereALTER ROLEwas needed. Observed bysuites/plugin_integration/test_pgsql_rbac_roles.pywithdbwarden-pgsql-rbacinstalled; the core checkout passes the real snapshot. - Reverse-engineered models can reference
funcwithout importing it. A column whose default isnow()is written asdefault=func.now()whilefuncis filtered out of the generated import line, so the artifact raisesNameError: name 'func' is not definedwhen dbwarden loads it. Reached through dbwarden's own bookkeeping tables, which the supported flow excludes - the generated file is unloadable only when they are included. - Integer primary keys are not auto-incrementing on MySQL and MariaDB. The
same model that produces
SERIALon PostgreSQL andAUTOINCREMENTon SQLite produces a plainid INTEGER NOT NULL PRIMARY KEY, and the first insert that omits the key fails with(1364, "Field 'id' doesn't have a default value"). The migration itself applies cleanly, so this surfaces only when a test writes a row.
dbwarden 0.16.5¶
Historical. Retained because the coverage matrix still refers to these cells.
- PostgreSQL ecommerce migrations require
IndexSpecmetadata; SQLAlchemy-onlyIndexdeclarations were not emitted, so the reference schemas use the public dbwarden metadata form. - MariaDB migration generation ordered
order_itemsbefore its referencedorderstable, producing a foreign-key creation error. - MySQL reverse engineering could report an incomplete
varchartype without a length during a final diff. - The
clickhouse://URL scheme was not recognized when converting to theclickhousedbSQLAlchemy dialect, corrupting credentials. - Reverse-engineered SQLite models reported an informational autoincrement drift for implicit integer primary keys.
Reproduce¶
DBWARDEN_HARNESS_RUN_INTEGRATION=1 uv run pytest -m integration suites/semantics
DBWARDEN_HARNESS_RUN_INTEGRATION=1 uv run pytest -m integration suites/round_trip
uv run pytest -q suites/semantics -m "not integration"
The last command needs no Docker and reproduces both SQLite findings.
The provider lifecycle matrix is independent of these dbwarden release findings and passes all declared backend/version cases.