mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX: SQLSelect count methods now cast to int (fixes #5498)
This commit is contained in:
parent
32f0a637b4
commit
d1df67d308
@ -542,7 +542,7 @@ class SQLSelect extends SQLConditionalExpression {
|
||||
$countQuery->setFrom(array('(' . $clone->sql($innerParameters) . ') all_distinct'));
|
||||
$sql = $countQuery->sql($parameters); // $parameters should be empty
|
||||
$result = DB::prepared_query($sql, $innerParameters);
|
||||
return $result->value();
|
||||
return (int)$result->value();
|
||||
} else {
|
||||
$clone->setSelect(array("count(*)"));
|
||||
}
|
||||
@ -551,7 +551,7 @@ class SQLSelect extends SQLConditionalExpression {
|
||||
}
|
||||
|
||||
$clone->setGroupBy(array());
|
||||
return $clone->execute()->value();
|
||||
return (int)$clone->execute()->value();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -594,7 +594,7 @@ class SQLSelect extends SQLConditionalExpression {
|
||||
$clone->orderby = null;
|
||||
$clone->groupby = null;
|
||||
|
||||
$count = $clone->execute()->value();
|
||||
$count = (int)$clone->execute()->value();
|
||||
// If there's a limit set, then that limit is going to heavily affect the count
|
||||
if($this->limit) {
|
||||
if($this->limit['limit'] !== null && $count >= ($this->limit['start'] + $this->limit['limit'])) {
|
||||
|
@ -30,14 +30,43 @@ class SQLQueryTest extends SapphireTest {
|
||||
|
||||
//basic counting
|
||||
$qry = SQLQueryTest_DO::get()->dataQuery()->getFinalisedQuery();
|
||||
$qry->setGroupBy('Common');
|
||||
$qry->setGroupBy('"Common"');
|
||||
$ids = $this->allFixtureIDs('SQLQueryTest_DO');
|
||||
$this->assertEquals(count($ids), $qry->count('"SQLQueryTest_DO"."ID"'));
|
||||
|
||||
$count = $qry->count('"SQLQueryTest_DO"."ID"');
|
||||
$this->assertEquals(count($ids), $count);
|
||||
$this->assertInternalType("int", $count);
|
||||
|
||||
//test with `having`
|
||||
if (DB::get_conn() instanceof MySQLDatabase) {
|
||||
$qry->setHaving('"Date" > 2012-02-01');
|
||||
$this->assertEquals(1, $qry->count('"SQLQueryTest_DO"."ID"'));
|
||||
$count = $qry->count('"SQLQueryTest_DO"."ID"');
|
||||
$this->assertEquals(1, $count);
|
||||
$this->assertInternalType("int", $count);
|
||||
}
|
||||
}
|
||||
|
||||
public function testUnlimitedRowCount() {
|
||||
//basic counting
|
||||
$qry = SQLQueryTest_DO::get()->dataQuery()->getFinalisedQuery();
|
||||
$ids = $this->allFixtureIDs('SQLQueryTest_DO');
|
||||
$qry->setLimit(1);
|
||||
|
||||
$count = $qry->unlimitedRowCount('"SQLQueryTest_DO"."ID"');
|
||||
$this->assertEquals(count($ids), $count);
|
||||
$this->assertInternalType("int", $count);
|
||||
|
||||
// Test without column - SQLSelect has different logic for this
|
||||
$count = $qry->unlimitedRowCount();
|
||||
$this->assertEquals(2, $count);
|
||||
$this->assertInternalType("int", $count);
|
||||
|
||||
//test with `having`
|
||||
if (DB::get_conn() instanceof MySQLDatabase) {
|
||||
$qry->setHaving('"Date" > 2012-02-01');
|
||||
$count = $qry->unlimitedRowCount('"SQLQueryTest_DO"."ID"');
|
||||
$this->assertEquals(1, $count);
|
||||
$this->assertInternalType("int", $count);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user