Skip to content

Render Integer display width directly after the type - #185

Open
simon-mundy wants to merge 3 commits into
php-db:0.6.xfrom
simon-mundy:fix/178-integer-display-width
Open

Render Integer display width directly after the type#185
simon-mundy wants to merge 3 commits into
php-db:0.6.xfrom
simon-mundy:fix/178-integer-display-width

Conversation

@simon-mundy

@simon-mundy simon-mundy commented Sep 7, 2026

Copy link
Copy Markdown
Member
Q A
Documentation yes
Bugfix yes
BC Break no
New Feature no
RFC no
QA yes
House Keeping no

Integer::getExpressionData() now inserts (%s) directly after the type and splices the display width in at index 2 as a Literal, so new Integer('i', false, null, ['length' => 11]) renders "i" INTEGER(11) NOT NULL and a nullable column with a default renders BIGINT(20) NULL DEFAULT '7'. BigInteger and SmallInteger inherit it. Nothing under Integer concatenates an option value into the spec any more.

The length option accepts an int or a string of digits; anything else throws Sql\Exception\InvalidArgumentException, since the value goes out as a raw Literal. Column::setOption() is widened to bool|int|string so setOption('length', 11) works under strict_types, as the constructor $options array and columns.md already allowed. Overlaps #169.

columns.md notes that MySQL deprecated integer display width in 8.0.17 and that the MySQL decorator will drop the attribute (phpdb-mysql#81); other platforms keep rendering it.

Same render-time approach as #183, implemented separately so the two PRs don't depend on each other. Worth hoisting into a shared hook on Column once both are in.

IntegerTest asserts the full rendered string rather than containment, setOption('length', 11) is covered in ColumnTest and through rendering, invalid option values are covered by a data provider, and BigIntegerTest/SmallIntegerTest each get a rendering test.

Fixes #178

The "length" option was concatenated onto the specification string after
Column::getExpressionData() had already appended NOT NULL and DEFAULT, so
the display width landed after the column attributes and MySQL rejected
the statement with error 1064. It was also the only column attribute to
reach SQL by string concatenation rather than as an Argument.

Insert "(%s)" directly after the type and splice the width in as a
Literal, matching AbstractLengthColumn. The option accepts an int or a
string of digits and anything else throws InvalidArgumentException, so
no raw option value reaches the SQL. setOption() now accepts int, as the
constructor options array and the documentation already did.

Fixes php-db#178

Signed-off-by: Simon Mundy <simon.mundy@peptolab.com>
@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@simon-mundy simon-mundy self-assigned this Sep 7, 2026
@github-project-automation github-project-automation Bot moved this to Todo in @phpdb Sep 7, 2026
@simon-mundy simon-mundy added this to the 0.6.0 milestone Sep 7, 2026
@simon-mundy simon-mundy added bug Something isn't working qa Improvements in quality assurance of the project labels Sep 7, 2026
CI installs the newest Mago, and 1.47.5 changed how the analyzer handles
nested array shapes: prepareDataHierarchy() re-binds a reference into the
MetadataData shape on every loop iteration, which no longer completes in
useful time. Re-type the reference as a plain array so the shape is not
re-derived per iteration, and adjust the expected findings accordingly.

Regenerate the analyzer baseline for the reworded findings in Select,
PredicateSet, Profiler and AbstractSql (the issues are unchanged, the
messages are not), and reduce the continuation indent of two multi-line
conditions in AbstractTableGateway to match the 1.47.4+ formatter.

Signed-off-by: Simon Mundy <simon.mundy@peptolab.com>
The tests declare their covered units with CoversMethod, so the private
helper added to Integer was executed but credited to nothing, and codecov
reported the patch as 40% covered.

Signed-off-by: Simon Mundy <simon.mundy@peptolab.com>
@simon-mundy
simon-mundy requested a review from tyrsson September 7, 2026 11:35
@simon-mundy simon-mundy added the documentation Improvements or additions to documentation label Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation qa Improvements in quality assurance of the project

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

Integer length option renders the display width after NOT NULL

1 participant