Skip to content

Commit 17f58a6

Browse files
committedApr 9, 2025
Fix Window function handling that failed because of "OVER" keyword case-sensitive comparison.
1 parent 07044bc commit 17f58a6

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed
 

‎src/Components/Expression.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use function is_array;
1616
use function rtrim;
1717
use function strlen;
18+
use function strtoupper;
1819
use function trim;
1920

2021
/**
@@ -372,7 +373,7 @@ public static function parse(Parser $parser, TokensList $list, array $options =
372373
&& ! ($prev[1]->flags & Token::FLAG_SYMBOL_VARIABLE)
373374
&& ! ($prev[1]->flags & Token::FLAG_SYMBOL_PARAMETER))
374375
|| ($prev[1]->type === Token::TYPE_NONE
375-
&& $prev[1]->token !== 'OVER'))
376+
&& strtoupper($prev[1]->token) !== 'OVER'))
376377
) {
377378
if (! empty($ret->alias)) {
378379
$parser->error('An alias was previously found.', $token);

‎tests/Builder/SelectStatementTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,40 @@ public function testBuilderSelectAllFormsOfIndexHints(): void
414414

415415
self::assertSame($query, $stmt->build());
416416
}
417+
418+
public function testBuilderSelectRowNumberOverAlias(): void
419+
{
420+
$query = 'SELECT id, pid, appid, appname, row_number() over (partition by pid, appid) as `group_row_number`'
421+
. ' FROM game group by appname';
422+
$expected = 'SELECT id, pid, appid, appname, row_number() over (partition by pid, appid) AS `group_row_number`'
423+
. ' FROM game GROUP BY appname';
424+
425+
$parser = new Parser($query);
426+
$stmt = $parser->statements[0];
427+
428+
self::assertSame($expected, $stmt->build());
429+
}
430+
431+
public function testBuilderSelectWindowFunctions(): void
432+
{
433+
$queryVsExpected = [
434+
'SELECT row_number() over (ORDER BY NULL) x' => 'SELECT row_number() over (ORDER BY NULL) AS `x`',
435+
'SELECT rank() over (ORDER BY NULL) x' => 'SELECT rank() over (ORDER BY NULL) AS `x`',
436+
'SELECT dense_rank() over (ORDER BY NULL) x' => 'SELECT dense_rank() over (ORDER BY NULL) AS `x`',
437+
'SELECT cume_dist() over (ORDER BY NULL) x' => 'SELECT cume_dist() over (ORDER BY NULL) AS `x`',
438+
'SELECT ntile(3) over (ORDER BY NULL) x' => 'SELECT ntile(3) over (ORDER BY NULL) AS `x`',
439+
'SELECT ROW_NUMBER() OVER(ORDER BY NULL) x' => 'SELECT ROW_NUMBER() OVER(ORDER BY NULL) AS `x`',
440+
'SELECT RANK()OVER(ORDER BY NULL) x' => 'SELECT RANK()OVER(ORDER BY NULL) AS `x`',
441+
'SELECT DENSE_RANK()OVER(ORDER BY NULL) x' => 'SELECT DENSE_RANK()OVER(ORDER BY NULL) AS `x`',
442+
'SELECT CUME_DIST()OVER(ORDER BY NULL) x' => 'SELECT CUME_DIST()OVER(ORDER BY NULL) AS `x`',
443+
'SELECT NTILE(3)OVER(ORDER BY NULL) x' => 'SELECT NTILE(3)OVER(ORDER BY NULL) AS `x`',
444+
];
445+
446+
foreach ($queryVsExpected as $query => $expected) {
447+
$parser = new Parser($query);
448+
$stmt = $parser->statements[0];
449+
450+
self::assertSame($expected, $stmt->build());
451+
}
452+
}
417453
}

0 commit comments

Comments
 (0)