Skip to content

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.

reserved_words:
  strategy: drop           # colliding columns are removed

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.