Loading data into an enterprise system is rarely the interesting part of a project and reliably one of the most expensive. The failure modes are familiar: an upsert emulated as a select-then-insert that races under concurrency, a load that reports a row count and nothing else, and a different code path for every input format. This release replaces all three with one pipeline.
A native upsert on eight engines
- One statement, not three. Insert-or-update is issued as the engine's own single-statement upsert on eight supported engines, so the operation is atomic at the database rather than assembled from a read and a write in application code.
- Offered to the writer. The native upsert is offered to the result-set writer, so a load that writes rows from a query result takes the same path as any other.
- Analysed before it is used. The loader determines whether an upsert is applicable for the target before choosing it, rather than assuming the engine will accept it.
The caller decides, and hears what happened
- Strategy is not the format's business. Insert-or-upsert becomes a parameter the caller sets, so the same file is loaded as an insert in one context and a merge in another without changing the file.
- Merge by default. The default strategy is a merge, and the load statistics report which strategy actually ran, so the behaviour is both safe and visible.
- One result contract. Every load reports through a single result type, so the outcome of a delimited load, a query-result load and a dictionary load are compared without translating between three shapes.
- The record that failed, by name. A delimited load that rejects a row identifies the input record, so a failed import is corrected at the line rather than bisected.
Typed values and structure-only builds
- Coerced to the declared type. Values are coerced to the target column's declared type before they are bound, so a load does not depend on the input's incidental formatting.
- Structure without seed data. A schema is created with the data load skipped, so an empty environment is provisioned with the correct structure and none of the reference content.
Existing loads keep working: the shared loader base and the single result contract sit under the current entry points, and the native upsert is used only where the target engine supports it, falling back to the previous behaviour where it does not.