Repository navigation
Weasel 9.25.0
The provider parity release. Twelve issues, fifteen PRs, and every object type in the support matrix covered except functions on MySQL and Oracle (#482).
Full upgrade notes: Upgrading to 9.25
⚠️ Two bugs that were losing work silently
Neither was reported by a user. Both were found by the parity work, and both had been failing quietly.
SQLite dropped the table to change a column — #477
TableDelta has always had a careful rebuild: create a new table, copy the surviving columns, drop the old one, rename. The migrator never called it. A change needing a rebuild reports Invalid, and Invalid was answered by dropping the object and creating it again.
Measured on a column type change: one row before, zero after — with a schema that looked entirely correct afterwards.
Affects every SQLite change ALTER TABLE cannot express — a column type change, a foreign key added or removed, a primary key change — under AutoCreate.All, which is what a developer resetting a local database and db-apply on an environment configured for it both use.
If you applied such a change on 9.24 or earlier, that data is gone and this release cannot bring it back. It will not happen again.
Oracle could not see indexes, foreign keys or primary keys — #474
ODP.NET will not execute several statements from one command, so an Oracle schema object could register exactly one introspection query — and Table spent it on columns. Everything else was invisible to the entire migration path.
A declared index was created with the table and never touched again. Adding one to an existing table did nothing. Changing one did nothing. Removing one left it in place. And AssertDatabaseMatchesConfigurationAsync reported a clean match throughout.
Expect your first Oracle run on 9.25 to apply index and foreign key changes it had been ignoring. That is the backlog being worked off, not new drift.
⚠️ Breaking
Column names are no longer rewritten (#458). PostgreSQL, Oracle, SQLite and SQL Server turned a space into an underscore — but only in TableColumn, so an index over Order Date named a column that did not exist. A column declared "Order Date" is now created as "Order Date". On an existing database that reads as a new column; write the underscore yourself if you were relying on the rewrite.
Identifiers are quoted where they previously were not on SQL Server and MySQL. Ordinary schemas are byte-identical. Anything hashing DDL — the schema fingerprint stamps — re-evaluates once on the first run after upgrade. That is a one-time "everything looks changed" pass, not drift.
Weasel.MySql.Sequence is [Obsolete]. MySQL has never had CREATE SEQUENCE at any version; that is MariaDB 10.3. The emulation could not be consumed. Use AUTO_INCREMENT.
New
| Views on SQL Server, Oracle and MySQL | All five providers now model views (#450) |
| Triggers, on all five providers | The one whole category no provider modelled (#452) |
| Stored procedures on PostgreSQL, MySQL and Oracle | Plus a shared StoredProcedureBase (#451) |
| Oracle packages, materialized views and synonyms; SQL Server synonyms; PostgreSQL enums, domains and composites | (#453) |
| A shared identifier quoting contract | IdentifierRules in Weasel.Core, with a cross-provider conformance suite (#447) |
| Every identifier a table writes is validated | Column names, primary key and check constraint names were previously validated by no provider (#448) |
| A shared index scenario matrix | Eleven create-then-introspect scenarios per provider (#449) |
| Oracle teardown drops what it used to leave behind | Triggers, packages, synonyms, object types, materialized views (#465) |
Three new documentation pages: Object Type Support, Identifiers and Quoting, Triggers and Stored Procedures.
Refused rather than ignored
Four properties that used to accept a value and silently do nothing now throw, naming the supported alternative: IndexDefinition.Predicate on MySQL and Oracle, Sequence.IncrementBy on MySQL, Trigger.Condition on SQL Server and MySQL, and Trigger.Timing = Before on SQL Server.