Release Notes — v1.14¶
Release date: April 2026
This release expands the reserved word protection system from three strategies to seven, giving users fine-grained control over how column and table name collisions with SQL reserved words are resolved.
Four new reserved word strategies¶
Prior releases supported prefix, quote, and error as the
only ways to handle reserved word collisions. v1.14 adds four
more strategies, covering the common conventions and edge
cases that dictionary-driven column renames surface in
practice.
target:
naming:
columns: snake_case
reserved_words:
strategy: suffix
suffix: "_col" # order -> order_col
suffix¶
Mirrors the existing prefix strategy but appends a
configurable string (default "_col") instead of prepending.
Useful when downstream conventions expect trailing markers.
rename¶
Applies an explicit mapping of reserved words to replacement
names. Unmapped collisions delegate to a configurable
fallback strategy (default quote).
reserved_words:
strategy: rename
rename_map:
order: order_name
select: select_col
fallback: error # any other collision fails
Keys are matched case-insensitively. The fallback field
accepts any other strategy except rename (no nesting), and
drop is not allowed as a fallback when applied to table
names.
revert¶
Discards the rename for colliding columns, keeping the
pre-normalization name. This is the missing piece for column
sets (M106) where an external dictionary may inadvertently map
a source column to a reserved word — revert quietly keeps
the original name on collision rather than failing or mangling
it.
reserved_words:
strategy: revert
# column_set maps order_date -> order
# "order" is reserved, so the column stays "order_date"
Reverts are logged at WARNING level so the action is visible in telemetry.
drop¶
Removes colliding columns from the output DataFrame entirely. This is a rare-use strategy intended for cases where the colliding column isn't needed downstream. Dropped columns are logged at WARNING level.
drop is not valid for table names — neither as a direct
strategy nor as a fallback. Both raise ConfigError at
runtime, since you cannot drop a table the same way you can
drop a column.
Configuration summary¶
ReservedWordConfig now exposes three new fields alongside
the existing ones:
| Field | Default | Purpose |
|---|---|---|
suffix |
"_col" |
String appended when strategy="suffix" |
rename_map |
None |
Explicit collision map for strategy="rename" |
fallback |
"quote" |
Fallback for unmapped rename collisions |
All seven strategies — prefix, quote, suffix, error,
rename, revert, drop — work for both column and table
naming, with the drop table-name restriction noted above.
See the configuration keys reference for the full field table and YAML examples for each strategy.
Internal refactor¶
Strategy resolution was refactored into per-strategy helper
functions registered in a dispatch dict. The change is
transparent to users but makes future strategy additions a
self-contained one-line registration. Existing
prefix/quote/error configurations work unchanged.
Backwards compatibility¶
Existing configurations using prefix, quote, or error
work identically. The three new fields (suffix,
rename_map, fallback) default to values that preserve the
v1.13 behavior when unset. The naming pipeline order is
unchanged: rename → normalize → dedup → reserved word
protection.
Also in this release¶
- Documentation drift fixes: thread-level execution guide
updated to reflect the 18-step pipeline (thread pre/post
steps now shown), home page transform count corrected to
23, target sub-configs (
dimension,fact,seed) added to the configuration-keys reference.