Skip to content

Avoid using a null alias as an array offset in getAliases()#658

Open
ardittirana wants to merge 1 commit into
phpmyadmin:masterfrom
ardittirana:fix-getaliases-null-array-offset
Open

Avoid using a null alias as an array offset in getAliases()#658
ardittirana wants to merge 1 commit into
phpmyadmin:masterfrom
ardittirana:fix-getaliases-null-array-offset

Conversation

@ardittirana

Copy link
Copy Markdown

Resolves the phpmyadmin/sql-parser side of phpmyadmin/phpmyadmin#20313.

Problem

SelectStatement::getAliases() builds a table-alias map:

$tables[$thisDb][$expr->alias] = $expr->table;

for every FROM/JOIN expression. When a table has no alias, $expr->alias is null, so this uses null as an array offset, which is deprecated as of PHP 8.5:

Using null as an array offset is deprecated, use an empty string instead

phpMyAdmin surfaces this as an ErrorException (SelectStatement.php:614) during table export on PHP 8.5.

Fix

Skip expressions without an alias, mirroring the existing isset($expr->alias) && $expr->alias !== '' guards a few lines above. The null-keyed entry was never read anyway — the only consumer looks up $tables[$thisDb][$expr->table], whose offset is always a non-empty string — so getAliases() output is unchanged.

Notes

  • Removed the now-resolved PossiblyNullArrayOffset entry from psalm-baseline.xml (verified via psalm --update-baseline; only that entry changed).
  • The sibling report #20312 points at Utils/Misc.php, which no longer exists — getAliases() was moved into SelectStatement in Remove Misc class #454 — so this covers the live code path.

Tests

  • Added a getAliasesProvider case mixing an unaliased table with an aliased one (the null-alias path), asserting unchanged output.
  • Full suite green: 1020 tests, 10244 assertions. phpcs/psalm clean for the change.

SelectStatement::getAliases() built a table-alias map with
`$tables[$thisDb][$expr->alias] = $expr->table` for every FROM/JOIN
expression. When a table has no alias, `$expr->alias` is null, so this
used null as an array offset, which is deprecated as of PHP 8.5
("Using null as an array offset is deprecated, use an empty string
instead"). The null-keyed entry was never read back either: the only
consumer looks up `$tables[$thisDb][$expr->table]`, whose offset is
always a non-empty string.

Skip expressions without an alias, mirroring the existing
`isset($expr->alias) && $expr->alias !== ''` checks above. getAliases()
output is unchanged. Removes the now-resolved PossiblyNullArrayOffset
entry from the Psalm baseline and adds a regression test.
// Only record an alias => table mapping when an alias exists.
// Using a null alias as an array offset is deprecated as of
// PHP 8.5, and such an entry is never read back below anyway.
if (! isset($expr->alias) || ($expr->alias === '')) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is better to check explicitly null

@codecov

codecov Bot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.30%. Comparing base (0ee3626) to head (04242cf).

Additional details and impacted files
@@            Coverage Diff            @@
##             master     #658   +/-   ##
=========================================
  Coverage     96.30%   96.30%           
- Complexity     2254     2256    +2     
=========================================
  Files            90       90           
  Lines          4982     4984    +2     
=========================================
+ Hits           4798     4800    +2     
  Misses          184      184           
Flag Coverage Δ
unit-8.2-ubuntu-latest 96.30% <100.00%> (+<0.01%) ⬆️
unit-8.3-ubuntu-latest 96.30% <100.00%> (+<0.01%) ⬆️
unit-8.4-ubuntu-latest 96.30% <100.00%> (+<0.01%) ⬆️
unit-8.5-ubuntu-latest 96.30% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

}

// Only record an alias => table mapping when an alias exists.
// Using a null alias as an array offset is deprecated as of

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment lines look like they where added by an AI
Please remove this line and below it adds no value

[
// An unaliased table alongside an aliased one. The unaliased
// table must not break alias resolution; previously its null
// alias was used as an array offset (deprecated in PHP 8.5).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this one

@williamdes

williamdes commented Jun 22, 2026

Copy link
Copy Markdown
Member

Thank you for this contribution!
if you used AI please make it add a Co author line.
Also I would like that this PR branch is based on 5.11.x so next version has your fix and not just 6.0

And finally please fix lint step

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants