Skip to content

Commit 1c897fd

Browse files
committed
Merge branch '5.11.x'
2 parents 5be4eed + 4c45eac commit 1c897fd

4 files changed

Lines changed: 56 additions & 9 deletions

File tree

phpstan-baseline.neon

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,12 +1965,6 @@ parameters:
19651965
count: 1
19661966
path: src/Utils/Query.php
19671967

1968-
-
1969-
message: '#^Cannot access property \$keyword on PhpMyAdmin\\SqlParser\\Token\|null\.$#'
1970-
identifier: property.nonObject
1971-
count: 1
1972-
path: src/Utils/Query.php
1973-
19741968
-
19751969
message: '#^Cannot call method has\(\) on PhpMyAdmin\\SqlParser\\Components\\OptionsArray\|null\.$#'
19761970
identifier: method.nonObject

psalm-baseline.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,6 @@
11221122
<code><![CDATA[$i]]></code>
11231123
</PossiblyNullOperand>
11241124
<PossiblyNullPropertyFetch>
1125-
<code><![CDATA[$lexer->list->getNextOfType(TokenType::Keyword)->keyword]]></code>
11261125
<code><![CDATA[$statement->into->dest]]></code>
11271126
</PossiblyNullPropertyFetch>
11281127
<PossiblyNullReference>

src/Utils/Query.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,12 +410,12 @@ public static function getClause(
410410
/**
411411
* The type of this clause.
412412
*/
413-
$clauseType = $lexer->list->getNextOfType(TokenType::Keyword)->keyword;
413+
$clauseType = $lexer->list->getNextOfType(TokenType::Keyword);
414414

415415
/**
416416
* The index of this clause.
417417
*/
418-
$clauseIdx = $clauses[$clauseType] ?? -1;
418+
$clauseIdx = $clauseType !== null ? $clauses[$clauseType->keyword] ?? -1 : -1;
419419

420420
$firstClauseIdx = $clauseIdx;
421421
$lastClauseIdx = $clauseIdx;

tests/Utils/QueryTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpMyAdmin\SqlParser\Tests\Utils;
66

77
use PhpMyAdmin\SqlParser\Parser;
8+
use PhpMyAdmin\SqlParser\Statement;
89
use PhpMyAdmin\SqlParser\Tests\TestCase;
910
use PhpMyAdmin\SqlParser\Utils\Query;
1011
use PhpMyAdmin\SqlParser\Utils\StatementFlags;
@@ -379,6 +380,40 @@ public function testGetAll(): void
379380
);
380381
}
381382

383+
public function testGetAllTableWithDotsAndReplaceClause(): void
384+
{
385+
$query = 'SELECT * FROM `test.2024-11-01` ORDER BY `test.2024-11-01`.`id` ASC;';
386+
387+
$statements = Query::getAll($query);
388+
389+
self::assertInstanceOf(Statement::class, $statements->statement);
390+
self::assertNotNull($statements->parser->list);
391+
392+
$fromClause = Query::replaceClause($statements->statement, $statements->parser->list, 'ORDER BY', '');
393+
self::assertEquals('SELECT * FROM `test.2024-11-01` ', $fromClause);
394+
395+
$fromClause = Query::replaceClause($statements->statement, $statements->parser->list, 'ORDER BY');
396+
self::assertEquals('SELECT * FROM `test.2024-11-01` ORDER BY ', $fromClause);
397+
398+
// With spaces
399+
$fromClause = Query::replaceClause($statements->statement, $statements->parser->list, 'ORDER BY ');
400+
self::assertEquals('SELECT * FROM `test.2024-11-01` ORDER BY ', $fromClause);
401+
}
402+
403+
public function testGetAllTableWithDotsAndReplaceClauseEmptyName(): void
404+
{
405+
$query = 'SELECT * FROM `test.2024-11-01` ORDER BY `test.2024-11-01`.`id` ASC;';
406+
407+
$statements = Query::getAll($query);
408+
409+
self::assertInstanceOf(Statement::class, $statements->statement);
410+
self::assertNotNull($statements->parser->list);
411+
412+
// No clause name
413+
$result = Query::replaceClause($statements->statement, $statements->parser->list, '');
414+
self::assertEquals(' SELECT * FROM `test.2024-11-01` ORDER BY `test.2024-11-01`.`id` ASC', $result);
415+
}
416+
382417
/** @param string[] $expected */
383418
#[DataProvider('getTablesProvider')]
384419
public function testGetTables(string $query, array $expected): void
@@ -626,6 +661,25 @@ public function testReplaceNonExistingPart(): void
626661
);
627662
}
628663

664+
public function testReplaceClauseTableWithDots(): void
665+
{
666+
$query = 'SELECT * FROM `test.2024-11-01` ORDER BY `test.2024-11-01`.`id` ASC;';
667+
668+
$parser = new Parser($query);
669+
670+
self::assertNotNull($parser->list);
671+
672+
$fromClause = Query::replaceClause($parser->statements[0], $parser->list, 'ORDER BY', '');
673+
self::assertEquals('SELECT * FROM `test.2024-11-01` ', $fromClause);
674+
675+
$fromClause = Query::replaceClause($parser->statements[0], $parser->list, 'ORDER BY');
676+
self::assertEquals('SELECT * FROM `test.2024-11-01` ORDER BY ', $fromClause);
677+
678+
// With spaces
679+
$fromClause = Query::replaceClause($parser->statements[0], $parser->list, 'ORDER BY ', '');
680+
self::assertEquals('SELECT * FROM `test.2024-11-01` ', $fromClause);
681+
}
682+
629683
public function testReplaceClauses(): void
630684
{
631685
$parser = new Parser('SELECT *, (SELECT 1) FROM film LIMIT 0, 10;');

0 commit comments

Comments
 (0)