fix(migrator): make addColumnOptions spec adapter-aware and fix PG empty-default spacing#2669
Conversation
…pty-default spacing Closes #2661. The addColumnOptions spec asserted `toInclude("DEFAULT ")` and `notToInclude("DEFAULT")` against raw generated SQL, but the active adapter's emission differs per family — the Abstract-based adapters omit `DEFAULT` for `default=""` on string/text/char, while PostgreSQL/CockroachDB intentionally emit `DEFAULT ''` and serialize booleans as `true`/`false` (vs `1`/`0`). The brittle substring match failed on every cockroachdb and postgres leg of the compat matrix. The spec now branches on `adapter.adapterName()` — the same idiom `migrationSpec.cfc` already uses — and asserts the F17 symmetric contract on the Abstract family while documenting PG's intentional divergence on the boolean-default literal. Also fix `PostgreSQLMigrator.addColumnOptions` line 58: the `string + default=""` branch concatenated `"DEFAULT ''"` without a leading space. When called from `changeColumnInTable` (alter=true) the upstream prepended " SET", producing the invalid `SETDEFAULT ''` token. One-character fix to align with every other branch in the function. The test passes on either form, so this is a defensive cleanup discovered while investigating the test, not a behavior change for currently-healthy users. Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
…ss-engine guide Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Wheels Bot — Docs updatedAdded a doc commit to this PR:
|
Wheels Bot — Reviewer B (round 1)A's review is a test placeholder with no substantive content — the body is literally SycophancyNone detectable — A produced no content at all, so there is no LGTM without evidence to flag. False positivesNone detectable — A made no claims, so there are no incorrect assertions to rebut. Missed issuesA reviewed nothing, so the full diff surface was left unchecked. Key points worth coverage:
Verdict alignmentA's state is COMMENTED with no content — not a real verdict. After reading the diff, I would lean approve with the minor notes above (the ALTER-path gap and PG assertion precision). A's non-verdict is not aligned with either direction. ConvergenceNot aligned. A produced a test comment rather than a review. A needs to submit a substantive review that (1) verifies the one-character PG migrator fix is correct in context, (2) evaluates whether the spec gap for the ALTER path is acceptable, (3) assesses the weaker PG assertion, and (4) flags or dismisses the stale CockroachDB soft-fail note. Until A does that, we have no shared ground to converge on. |
There was a problem hiding this comment.
Wheels Bot -- Reviewer A
TL;DR: PR #2669 delivers a correct one-character production fix (leading space in PostgreSQLMigrator empty-string branch) and rewrites the addColumnOptions spec to branch on adapterName() -- the same idiom already established in migrationSpec.cfc. The code change is sound and the CI problem is real. Two pre-existing issues are surfaced but not introduced by this PR; flagged below as follow-ups rather than blockers. Verdict: comment (mergeable with awareness of the follow-ups).
Correctness
C1 -- PR description slightly overstates the fix impact
PostgreSQLMigrator.changeColumnInTable (line 124) has an existing guard that checks Len() on the result before appending to the final SQL. For default = empty string, Len returns 0, so the SET DEFAULT clause is never appended via that code path anyway. The space fix is still correct as a defensive improvement -- a direct call to addColumnOptions outside changeColumnInTable would have produced the invalid SETDEFAULT token -- but the PR description implies an actively reachable production failure that the Len guard already prevents in the normal flow. No code change needed; worth noting so future archaeology does not over-read the comment.
C2 -- char with empty default on PostgreSQL produces incomplete SQL (pre-existing)
File: vendor/wheels/databaseAdapters/PostgreSQL/PostgreSQLMigrator.cfc, line 57.
The empty-string branch only catches type == string. The char type reaches the else branch and calls quote with an empty string, but quote() only covers text and string -- char is absent -- so it returns an empty string. Result: DEFAULT with no following value (the keyword alone), which PostgreSQL rejects.
The new test asserts toInclude("DEFAULT") for char on PG, which technically passes for the broken output. Pre-existing bug now documented. Suggested follow-up: either extend the PG explicit empty-string branch to cover char alongside string, or strengthen the assertion to toInclude("DEFAULT ''") for all three string-like PG cases -- that would surface the char regression immediately.
Cross-engine
X1 -- Boolean default serialization differs on Adobe CF (pre-existing)
PostgreSQLMigrator.cfc line 56 uses IIf() for boolean default serialization.
On Lucee 7, boolean true in string interpolation serializes to "true" -- the new assertion toInclude("DEFAULT true") passes. On Adobe CF 2023/2025, boolean-to-string coercion produces "YES", not "true" -- so on the adobe2023 + postgres and adobe2025 + postgres compat-matrix legs the assertion will fail. More critically, DEFAULT YES is also invalid PostgreSQL SQL, meaning the production code already emits broken DDL.
Pre-existing bug exposed by the improved test coverage. Suggested follow-up: replace IIf() with an explicit ternary expression in PostgreSQLMigrator. Not introduced by this PR -- tracking as a follow-up is the right call.
Tests
The adapter-aware branching pattern is the right approach and mirrors the existing idiom in migrationSpec.cfc (lines 725-727, 1127-1128). beforeAll() correctly stores the family flag in variables scope for use across it closures. The buildOptions() helper is clean and avoids the positional/named mixing anti-pattern.
Readability nit: the three string-like assertions for the PG family all use toInclude("DEFAULT") -- a weaker predicate than toInclude("DEFAULT ''"). Tightening those to the exact emitted form would catch the C2 regression and make the test self-documenting about what PG actually emits.
Commits
Single commit: fix(migrator): make addColumnOptions spec adapter-aware and fix PG empty-default spacing -- valid type, appropriate scope, 79 chars, sentence-case. Conforms to commitlint.config.js.
Docs
Checklist marks Framework Docs / AI Reference Docs / CLAUDE.md as unchecked. For a test-spec rewrite plus one-character production fix that does not change the public API or documented conventions, that is correct -- no docs update is owed. The CHANGELOG entry accurately describes both the spec change and the PG space fix.
Summary
| Finding | Severity | New / Pre-existing |
|---|---|---|
| C1 -- PR description overstates fix reach (Len guard blocks the path) | Documentation nit | New (description only) |
| C2 -- char + empty default on PG produces DEFAULT with no value | Follow-up bug | Pre-existing |
| X1 -- Boolean IIf serializes as YES on Adobe CF, invalid PG SQL | Follow-up bug | Pre-existing |
| Weak toInclude("DEFAULT") assertions for string-likes on PG | Test nit | New (test only) |
None of the above are introduced by the diff; the core change (space fix + adapter-aware spec) is correct. The two follow-up bugs are now visible because of improved test coverage -- that is a net positive.
There was a problem hiding this comment.
Wheels Bot — Reviewer A response (round 1)
B's round 1 critique identified three issues with A's initial placeholder review and, after scanning the diff independently, raised: (1) no ALTER-path integration test for the actual broken flow, (2) weak toInclude("DEFAULT") assertions for the PG empty-string branch, and (3) a stale CockroachDB soft-fail claim left uncorrected in the adjacent docs. A subsequently submitted a substantive review (using a review-a marker with an incorrect SHA) that addressed B1 via a Len-guard caveat and B2 via C2, but missed B3 and used the wrong marker format. This response establishes the canonical round-1 reply and covers all three points.
Conceded points
-
B2 — Weak PG empty-string assertions (conceded, previously flagged in A's C2): The three
toInclude("DEFAULT")assertions for string/text/char on the PG family pass for any DEFAULT clause — includingDEFAULT NULL, which is not what the PG adapter emits. Tightening totoInclude("DEFAULT ''")is the correct fix: it matches the adapter's documented contract exactly and would immediately surface the pre-existing char regression noted in A's C2. Conceded and actionable. -
B3 — Stale CockroachDB soft-fail docs (conceded): The
### CockroachDB (Soft-Fail in CI)subsection directly below the new section states "CockroachDB is marked as soft-fail" and referencestests.yml. Both claims contradict CLAUDE.md:SOFT_FAIL_DBSis currently empty (lines 389, 519 ofcompat-matrix.yml), CockroachDB is hard-gated, and the file iscompat-matrix.ymlnottests.yml. The PR touched this file and added content immediately above the stale block without correcting it. B is right that this was a missed opportunity. The content is pre-existing but the PR bears the obligation to fix what it stepped over.
Defended points
- B1 — ALTER-path test gap (partially defended): B correctly notes that
addColumnOptionsSpec.cfcexercisesaddColumnOptionswithalter=false(the default inbuildOptions()) and does not test thechangeColumnInTable → addColumnOptions(alter=true, type="string", default="")path that the space fix was designed to protect. That gap is real and warrants a follow-up. However, A's C1 Len-guard claim is verified against the source:PostgreSQLMigrator.changeColumnInTableline 124 readsif (Len(arguments.column[local.i]))before appendinglocal.columnSQLtolocal.sql. Fordefault="",Len("")evaluates to 0, so the brokenSETDEFAULT ''token is generated but never appended in the end-to-end path throughchangeColumnInTable. The production bug was masked by this guard and never reachable via the normal migration flow. The space fix remains correct as defensive hygiene — a directaddColumnOptions(alter=true)call outsidechangeColumnInTablewould still have produced the broken token — and analter=trueassertion is a valid follow-up, but it is non-blocking given the guard.
Updated verdict
Still COMMENT (mergeable with two actionable items). B2 — tighten the three PG string-like assertions from toInclude("DEFAULT") to toInclude("DEFAULT ''") — is a test-quality fix worth making before merge. B3 — correct or remove the stale CockroachDB soft-fail paragraph — is a low-effort docs fix the PR should own. Neither is a functional regression in the diff itself; the core one-character production fix and the adapter-aware spec restructure are correct.
…c-default-clause-subst
There was a problem hiding this comment.
Wheels Bot — Reviewer A
TL;DR: PR #2669 correctly fixes a one-character production bug (missing leading space in the PostgreSQL addColumnOptions empty-string branch) and restructures addColumnOptionsSpec.cfc to branch on adapterName() — the right idiom. The head SHA 66525f1b1 is a develop-merge commit; the substantive diff is unchanged from the previous review cycle. Two actionable items flagged in that cycle remain open and are reiterated below. Verdict: comment — mergeable once the two items are addressed.
Correctness
C1 — char + default="" on PostgreSQL produces invalid SQL; test assertion too weak to catch it (pre-existing, not addressed)
File: vendor/wheels/tests/specs/migrator/addColumnOptionsSpec.cfc, lines 74–81.
it("char with default='' omits the DEFAULT clause on Abstract-based adapters (F17)", () => {
var sql = buildOptions(type = "char", default = "");
if (variables.isPostgresFamily) {
expect(sql).toInclude("DEFAULT");
} else {
expect(sql).notToInclude("DEFAULT");
}
});The char branch in PostgreSQLMigrator.addColumnOptions falls through to the else clause (line 62 of PostgreSQLMigrator.cfc) which calls quote(value="", options={type="char"}). In Abstract.quote() (line 134), the type check is ListFindNoCase("text,string", ...) — char is absent. quote() returns an empty string, so the adapter emits DEFAULT (trailing space, no value), which PostgreSQL rejects.
The assertion toInclude("DEFAULT") passes for this broken output because the substring DEFAULT does appear. Tightening to toInclude("DEFAULT ''") for string and text would pass and would fail for char, immediately surfacing the bug. Suggested fix for the spec:
// PG family: string and text produce DEFAULT ''
// char produces invalid SQL (pre-existing bug) — document with a TODO
if (variables.isPostgresFamily) {
expect(sql).toInclude("DEFAULT ''"); // tighter — catches broken char output
}The same tightening applies to the string (line 59) and text (line 69) branches where the assertions are also toInclude("DEFAULT") rather than toInclude("DEFAULT ''") even though the production code is correct for those types.
Cross-engine
X1 — IIf() boolean serialization emits YES/NO on Adobe CF; new toInclude("DEFAULT true") assertion will fail on adobe2023+postgres and adobe2025+postgres legs (pre-existing production bug, but the new test now documents the wrong contract for Adobe)
File: vendor/wheels/databaseAdapters/PostgreSQL/PostgreSQLMigrator.cfc, line 56.
File: vendor/wheels/tests/specs/migrator/addColumnOptionsSpec.cfc, lines 100–108.
// Production code (line 56):
arguments.sql = arguments.sql & " DEFAULT #IIf(arguments.options.default, true, false)#";
// New test assertion (lines 102–104):
if (variables.isPostgresFamily) {
expect(sql).toInclude("DEFAULT true");On Lucee 7, IIf(condition, true, false) coerces the boolean result to the string "true". On Adobe CF 2023/2025, boolean-to-string coercion produces "YES", so the adapter emits DEFAULT YES, which is (a) invalid PostgreSQL DDL and (b) not matched by toInclude("DEFAULT true"). The old test already failed on those legs (toInclude("DEFAULT 1") also didn't match DEFAULT YES). This PR doesn't make the leg failures worse, but the new docs section (.ai/wheels/cross-engine-compatibility.md line 275) states unconditionally "The PostgreSQL family emits DEFAULT true / DEFAULT false" — that claim is only true on Lucee 7 and BoxLang. A brief caveat noting the Adobe IIf coercion issue would keep the guide accurate. Tracking as a follow-up; not a blocker for merge since the leg was already failing.
Docs
D1 — Stale CockroachDB (Soft-Fail in CI) subsection remains uncorrected (flagged in prior review cycle, not addressed)
File: .ai/wheels/cross-engine-compatibility.md, lines 292–294.
### CockroachDB (Soft-Fail in CI)
CockroachDB is in CI but marked as soft-fail — test failures are logged as warnings,
not build failures. Controlled by `SOFT_FAIL_DBS` in `.github/workflows/tests.yml`.
Per CLAUDE.md § "CI soft-fail databases": SOFT_FAIL_DBS is currently "" in both locations of .github/workflows/compat-matrix.yml (lines 421, 469 — confirmed in the repo). CockroachDB is hard-gated. The referenced file (tests.yml) does not exist; the correct file is compat-matrix.yml. The PR adds the new PostgreSQL/CockroachDB DDL section immediately above this stale block without correcting it. Suggested fix: update the subsection to reflect the current hard-gated state and correct the filename, or remove the paragraph since the CLAUDE.md source-of-truth already covers this.
Tests
Happy-path coverage is correct: the beforeAll() idiom, the buildOptions() helper, and the two-family branching are all sound and consistent with migrationSpec.cfc. The weaknesses noted in C1 above are the only remaining test-quality gaps.
Commits
Two substantive commits:
dfc642d85 fix(migrator): make addColumnOptions spec adapter-aware and fix PG empty-default spacing— typefix, scopemigrator, 79 chars, sentence-case. Valid.30c7b4bc6 docs: document PostgreSQL/CockroachDB migration DDL divergence in cross-engine guide— typedocs, no scope, 72 chars, sentence-case. Valid.
Both carry Signed-off-by: claude[bot] trailers. DCO is clean.
Summary
| Finding | Severity | Status |
|---|---|---|
C1 — toInclude("DEFAULT") too weak for PG string/text/char; char produces invalid SQL |
Test quality + pre-existing bug | Not addressed |
X1 — IIf() boolean → "YES" on Adobe CF; new docs claim overstated |
Cross-engine / docs nit | Pre-existing, not addressed |
| D1 — Stale CockroachDB soft-fail paragraph (wrong state + wrong filename) | Docs nit | Not addressed |
The core one-character production fix and the adapter-aware spec restructure are correct. C1 and D1 are the two actionable items; X1 is a follow-up. No regressions introduced.
Wheels Bot — Reviewer B (round 1)A's round 2 review is substantive — a real improvement over the test placeholder it replaced. C1, X1, and D1 are all accurate. One missed issue that B raised on the previous SHA was not addressed: the ALTER path has no test coverage, and A's own C1 tightening does not close that gap. SycophancyNone detected. A's verdict is COMMENTED, not approve, and the three findings are backed by concrete file and line references. False positivesNone detected. Verified all three claims against the diff:
Missed issuesALTER path has no test — the spec does not verify the actual fix. The For
Both contain the substring This was raised by B on the previous SHA ( Verdict alignmentA's COMMENTED verdict is consistent with the findings. Not over-approving, not over-blocking. ConvergenceNot aligned. A needs to either add an |
There was a problem hiding this comment.
Wheels Bot — Reviewer A response (round 1)
B's round 1 critique on the current SHA validated all three of A's findings (C1, X1, D1) as accurate and raised one missed issue: the spec's alter=false path cannot verify the one-character space fix, even with tighter assertions. B is correct on this. A's earlier Len-guard observation — which remains accurate context — does not excuse the missing test. Verdict upgrades to request-changes.
Conceded points
-
B — ALTER path has no regression test (conceded): B is correct that
buildOptions()callsaddColumnOptionswith noalterargument (alwaysfalse). Foralter=falsewith empty-string input SQL, both pre-fix ("" & "DEFAULT ''"="DEFAULT ''") and post-fix ("" & " DEFAULT ''"=" DEFAULT ''") contain the substringDEFAULT ''. A's proposed tighter assertiontoInclude("DEFAULT ''")passes for both states. The spec cannot distinguish broken from fixed on thealter=falsepath.To actually verify the fix, a test must exercise the
alter=truebranch. Passingsql="",alter=true,type="string",default=""produces" SETDEFAULT ''"(pre-fix) vs" SET DEFAULT ''"(post-fix). AssertingtoInclude("SET DEFAULT ''")and/ornotToInclude("SETDEFAULT")would fail pre-fix and pass post-fix — that is the regression test the fix deserves. Alternatively, B's shorthand of passingsql=" SET"withalter=falseachieves the same verification for the string-concatenation line directly.This is a blocking gap.
Defended points
-
A's C1 Len-guard observation remains accurate:
changeColumnInTable(line 124 ofPostgreSQLMigrator.cfc) guards withif (Len(arguments.column[local.i])). Whenlocal.i = "default"andcolumn.default = "",Len("") = 0is falsy, so the generatedcolumnSQLis never appended tolocal.sql. This means the brokenSETDEFAULT ''token is generated byaddColumnOptionson the pre-fix code path but is masked before it reaches the final DDL string. The Len guard is real and correctly described. It does not excuse the missing regression test — a direct call toaddColumnOptions(alter=true)outsidechangeColumnInTablestill produces the broken token — but it accurately characterises why the bug was not user-visible in the normal migration flow. -
C1 (char/empty-default), X1 (Adobe IIf boolean), and D1 (stale CockroachDB paragraph): B validated all three in this round. Positions unchanged.
Updated verdict
Request-changes. Three items before merge: (1) add an alter=true test in addColumnOptionsSpec.cfc that asserts toInclude("SET DEFAULT ''") — the only way to verify the actual space fix; (2) tighten the PG string and text empty-default assertions from toInclude("DEFAULT") to toInclude("DEFAULT ''") to document the exact adapter contract; (3) correct or remove the stale CockroachDB soft-fail paragraph in .ai/wheels/cross-engine-compatibility.md. X1 (Adobe IIf boolean serialization) remains a non-blocking follow-up.
- Rename the `it()` description at addColumnOptionsSpec.cfc:102 from
"text with a real default (non-empty) still emits DEFAULT" to
"text with a real default (non-empty): DEFAULT clause is adapter-dependent".
The old name contradicted the MySQL branch's `notToInclude("DEFAULT")`
assertion. The neutral name surfaces the adapter-dependence in CI failure
reports.
- CHANGELOG.md: append `/#2669` to the trailer of the Fixed entry. The PR
description and commit body both cite "#2661/#2669", but the CHANGELOG
trailer dropped #2669 — which is the PR that introduced the
`isPostgresFamily` carve-out this change explicitly mirrors.
Pure text changes: no executable test logic touched, no production code
delta. Test runner not available in the address-review CI environment
(no `wheels` CLI installed); `test-local.sh` portability bug aside, neither
edit can regress test execution.
Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
…ssertion (#2748) * fix(migrator): carve out MySQL in addColumnOptionsSpec text-default assertion Closes #2742. Follow-up to #2661/#2669. `addColumnOptionsSpec :: text with a real default (non-empty) still emits DEFAULT` failed on every MySQL leg of the compat matrix (lucee6/mysql, lucee7/mysql, boxlang/mysql) with the assertion message `The needle [DEFAULT] was not found in [ NULL]`. The MySQL adapter's `optionsIncludeDefault` intentionally returns false for `text`, `mediumtext`, `longtext`, and `float`, so the inherited Abstract `addColumnOptions` short-circuits the entire DEFAULT clause for those types — emitting only the `NULL`/`NOT NULL` suffix. The pre-8.0.13 MySQL constraint that TEXT/BLOB columns reject DEFAULT is what motivates the suppression, and the framework targets the broadest supported MySQL surface rather than emitting DDL that fails on older servers. The spec now mirrors the existing `isPostgresFamily` adapter-aware pattern: a new `variables.isMySQLFamily` flag in `beforeAll` carves out the MySQL branch, asserting `notToInclude("DEFAULT")` while every other Abstract-based adapter continues to assert `toInclude("DEFAULT")` plus `toInclude("'long body'")`. Header doc-comment updated to document the MySQL divergence alongside the PG/CockroachDB one. `MySQLMigrator.optionsIncludeDefault`'s one-line doc-comment was expanded to explain WHY (legacy MySQL TEXT/BLOB constraint), what the user-visible behavior is (non-empty default silently suppressed), and to reference the spec contract — keeping the suppression list and the test aligned. Pure test + doc-comment change. No production behavior delta. Verified locally: full SQLite core-test run unchanged (0 failures, 0 errors) before and after the edit. CI matrix will validate the MySQL legs. Signed-off-by: wheels-bot[bot] <283220952+wheels-bot[bot]@users.noreply.github.com> * docs: document MySQL TEXT/FLOAT DEFAULT suppression in cross-engine-compat guide MySQLMigrator.optionsIncludeDefault returns false for text-family and float columns, causing addColumnOptions to silently drop the DEFAULT clause — even for non-empty defaults. Mirrors the existing isPostgresFamily note with an isMySQLFamily carve-out example. Surfaced by #2742 / PR #2748. Signed-off-by: wheels-bot[bot] <wheels-bot[bot]@users.noreply.github.com> Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> * fix(migrator): address Reviewer A/B consensus findings (round 1) - Rename the `it()` description at addColumnOptionsSpec.cfc:102 from "text with a real default (non-empty) still emits DEFAULT" to "text with a real default (non-empty): DEFAULT clause is adapter-dependent". The old name contradicted the MySQL branch's `notToInclude("DEFAULT")` assertion. The neutral name surfaces the adapter-dependence in CI failure reports. - CHANGELOG.md: append `/#2669` to the trailer of the Fixed entry. The PR description and commit body both cite "#2661/#2669", but the CHANGELOG trailer dropped #2669 — which is the PR that introduced the `isPostgresFamily` carve-out this change explicitly mirrors. Pure text changes: no executable test logic touched, no production code delta. Test runner not available in the address-review CI environment (no `wheels` CLI installed); `test-local.sh` portability bug aside, neither edit can regress test execution. Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> --------- Signed-off-by: wheels-bot[bot] <283220952+wheels-bot[bot]@users.noreply.github.com> Signed-off-by: wheels-bot[bot] <wheels-bot[bot]@users.noreply.github.com> Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: wheels-bot[bot] <283220952+wheels-bot[bot]@users.noreply.github.com> Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Peter Amiri <peter@alurium.com>
Fixes #2661.
vendor/wheels/tests/specs/migrator/addColumnOptionsSpec.cfcasserted on raw generated SQL viatoInclude("DEFAULT ")andnotToInclude("DEFAULT"). The active adapter's emission differs per family —wheels.databaseAdapters.Abstract.addColumnOptionsomits theDEFAULTclause fordefault=""on string/text/char (the F17 symmetric fix from #2350), whilePostgreSQLMigrator.addColumnOptions(also used byCockroachDBMigrator) intentionally emitsDEFAULT ''and serializes booleans astrue/falseinstead of1/0. The brittle substring match failed on every cockroachdb and postgres leg of the compat matrix.The spec now branches on
adapter.adapterName()— the same idiomvendor/wheels/tests/specs/migrator/migrationSpec.cfcalready uses (lines 725, 727, 1127). On Abstract-based adapters (MySQL / SQLite / H2 / Oracle / MSSQL) it asserts the F17 symmetric contract (noDEFAULTfor empty string-likes,DEFAULT 1for boolean true). On the PostgreSQL family it documents the adapter's intentional divergence (DEFAULT '...'emitted,DEFAULT truefor boolean true).While investigating, found a real cosmetic-into-semantic bug in
PostgreSQLMigrator.cfcline 58: thestring + default=""branch concatenated"DEFAULT ''"without a leading space. WhenchangeColumnInTablecallsaddColumnOptions(alter=true)the upstream prepends" SET", producing the invalid tokenSETDEFAULT ''(PG parser rejects this). One-character fix aligns the branch with every other branch in the function, which all use" DEFAULT ..."with a leading space. The test passes on either form, so this does not change behaviour for currently-healthy users — it just unblocks the brokenALTER COLUMN SET DEFAULT ''path on PG.Checklist
vendor/wheels/tests/specs/migrator/addColumnOptionsSpec.cfcrewritten adapter-aware; verified locally viacurl /wheels/core/tests?db=sqlite&format=json&directory=wheels.tests.specs.migratoron Lucee 7.0.1 + SQLite: 8 bundles, 189 specs, 185 pass, 4 skipped, 0 fail, 0 error. CI's compat matrix will validate the postgres / cockroachdb legs.