Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1b07404

Browse files
Merge pull request #623 from niconoe-/fix/window-function-over-management
Fix Window function handling that failed because of "OVER" keyword case-sensitive comparison.
2 parents a193ec7 + 17f58a6 commit 1b07404

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)

AltStyle によって変換されたページ (->オリジナル) /