Issue #2527816 by jhedstrom, pfrenssen, chx, catch: Logic error in SqlContentEntityStorage::countFieldData() attempts to drop `name` column

8.0.x
Alex Pott 2015-07-08 09:38:33 +01:00
parent d404b26005
commit 49f5b153a0
2 changed files with 32 additions and 4 deletions

View File

@ -1623,9 +1623,11 @@ class SqlContentEntityStorage extends ContentEntityStorageBase implements SqlEnt
$or->isNotNull($table_mapping->getFieldColumnName($storage_definition, $property_name));
}
$query->condition($or);
$query
->fields('t', array($this->idKey))
->distinct(TRUE);
if (!$as_bool) {
$query
->fields('t', array($this->idKey))
->distinct(TRUE);
}
}
// @todo Find a way to count field data also for fields having custom
@ -1635,7 +1637,9 @@ class SqlContentEntityStorage extends ContentEntityStorageBase implements SqlEnt
// If we are performing the query just to check if the field has data
// limit the number of rows.
if ($as_bool) {
$query->range(0, 1);
$query
->range(0, 1)
->addExpression('1');
}
else {
// Otherwise count the number of rows.

View File

@ -29,6 +29,11 @@ class FieldDataCountTest extends FieldUnitTestBase {
*/
protected $storageRev;
/**
* @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
*/
protected $storageUser;
/**
* {@inheritdoc}
*/
@ -37,6 +42,7 @@ class FieldDataCountTest extends FieldUnitTestBase {
$this->installEntitySchema('entity_test_rev');
$this->storage = \Drupal::entityManager()->getStorage('entity_test');
$this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev');
$this->storageUser = \Drupal::entityManager()->getStorage('user');
}
/**
@ -136,4 +142,22 @@ class FieldDataCountTest extends FieldUnitTestBase {
$this->assertEqual(count($entity->{$this->fieldTestData->field_name_2}), $cardinality, format_string('Revision %revision_id: expected number of values.', array('%revision_id' => $first_revision)));
}
/**
* Verify that we can count a table that contains an entry with index 0.
*/
public function testCountWithIndex0() {
// Create an entry for the anonymous user, who has user ID 0.
$user = $this->storageUser
->create(array(
'uid' => 0,
'name' => 'anonymous',
'mail' => NULL,
'status' => FALSE,
));
$user->save();
$storage = $user->getFieldDefinition('name')->getFieldStorageDefinition();
$this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
}
}