diff --git a/src/Processor/Expression/FunctionEvaluator.php b/src/Processor/Expression/FunctionEvaluator.php index c6db5e8f..b82d27a5 100644 --- a/src/Processor/Expression/FunctionEvaluator.php +++ b/src/Processor/Expression/FunctionEvaluator.php @@ -372,7 +372,8 @@ private static function sqlSum( $sum = 0; if (!$result->rows) { - if ($expr instanceof FunctionExpression) { + $isQueryWithoutFromClause = empty($result->columns); + if ($expr instanceof FunctionExpression && $isQueryWithoutFromClause) { return self::evaluate($conn, $scope, $expr, [], $result); } diff --git a/tests/EndToEndTest.php b/tests/EndToEndTest.php index f59be4f0..1d5352dc 100644 --- a/tests/EndToEndTest.php +++ b/tests/EndToEndTest.php @@ -2,9 +2,6 @@ namespace Vimeo\MysqlEngine\Tests; use PDOException; -use Vimeo\MysqlEngine\Parser\Token; -use Vimeo\MysqlEngine\Query\Expression\ColumnExpression; -use Vimeo\MysqlEngine\TokenType; class EndToEndTest extends \PHPUnit\Framework\TestCase { @@ -13,6 +10,29 @@ public function tearDown() : void \Vimeo\MysqlEngine\Server::reset(); } + public function testSumWithEmptyResultSetReturnsNull() + { + $sql = " + SELECT + SUM( + IF( + id > 1, + 0, + 1 + ) + ) + FROM + video_game_characters + WHERE + id > 100; + "; + + $pdo = self::getConnectionToFullDB(); + $query= $pdo->query($sql); + + $this->assertNull($query->fetchColumn()); + } + public function testSelectEmptyResults() { $pdo = self::getConnectionToFullDB();