Match the enum-whitelist CHECK sweep to the YugabyteDB rendering

FixInitializerService
Shipped
August 14, 2026 at 5:06 PM UTC
Author
Kamo
Commit
2aef5d6

dropStaleEnumWhitelistChecks() looked for '% IN (%', which is how CockroachDB stored a @Enumerated(EnumType.STRING) whitelist. PostgreSQL and YugabyteDB normalize the identical constraint to '(col)::text = ANY ((ARRAY[...])::text[])', so since the cutover the sweep has matched ZERO rows while logging success — 495 live whitelists frozen at whatever values existed when their table was made. The failure surfaces far from here. TimecardEventType.PUNCH_VOIDED was appended after hr_timecard_audit_event was created, so every void's audit insert failed the stale CHECK with SQLState 23514; because that insert flushed inside a nested @Transactional the tx went rollback-only and the caller saw an opaque UnexpectedRollbackException, surfacing in the timecard editor as "editor void failed" with nothing actually saved. Verified against the live database: the widened predicate matches 495 stale whitelists (including **************** and zero of the hand-written invariant CHECKs this runner declares — those all carry AND/OR/IS NULL and stay excluded. '=' deliberately is NOT an exclusion; the ANY-ARRAY rendering contains one.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing