diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml index b00a3e8..0c9ad70 100644 --- a/core/config/schema/core.data_types.schema.yml +++ b/core/config/schema/core.data_types.schema.yml @@ -496,6 +496,9 @@ field.storage_settings.uri: max_length: type: integer label: 'Maximum length' + case_sensitive: + type: boolean + label: 'Case sensitive' field.field_settings.uri: type: mapping diff --git a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php index 5095d20..d1b2a33 100644 --- a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php +++ b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php @@ -166,9 +166,9 @@ public function addField($field, $type, $langcode, &$case_sensitive = FALSE) { if ($field_storage) { $column = $field_storage->getMainPropertyName(); - $propertyDefinitions = $field_storage->getPropertyDefinitions(); - if (isset($propertyDefinitions[$column])) { - $case_sensitive = $propertyDefinitions[$column]->getSetting('case_sensitive'); + $base_field_property_definitions = $field_storage->getPropertyDefinitions(); + if (isset($base_field_property_definitions[$column])) { + $case_sensitive = $base_field_property_definitions[$column]->getSetting('case_sensitive'); } } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php index a50696b..0c08eaf 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php @@ -33,6 +33,7 @@ class UriItem extends StringItem { public static function defaultStorageSettings() { return array( 'max_length' => 2048, + 'case_sensitive' => FALSE, ) + parent::defaultStorageSettings(); } @@ -56,6 +57,7 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) 'type' => 'varchar', 'length' => (int) $field_definition->getSetting('max_length'), 'not null' => TRUE, + 'binary' => $field_definition->getSetting('case_sensitive'), ), ), ); diff --git a/core/modules/file/src/Tests/SaveTest.php b/core/modules/file/src/Tests/SaveTest.php index ee6c1a3..cc12515 100644 --- a/core/modules/file/src/Tests/SaveTest.php +++ b/core/modules/file/src/Tests/SaveTest.php @@ -7,7 +7,7 @@ namespace Drupal\file\Tests; -use Drupal\Core\Language\LanguageInterface; +use Drupal\file\Entity\File; /** * File saving tests. @@ -17,7 +17,7 @@ class SaveTest extends FileManagedUnitTestBase { function testFileSave() { // Create a new file entity. - $file = entity_create('file', array( + $file = File::create(array( 'uid' => 1, 'filename' => 'druplicon.txt', 'uri' => 'public://druplicon.txt', @@ -59,7 +59,7 @@ function testFileSave() { // Try to insert a second file with the same name apart from case insensitivity // to ensure the 'uri' index allows for filenames with different cases. - $file = entity_create('file', array( + $uppercase_file = File::create(array( 'uid' => 1, 'filename' => 'DRUPLICON.txt', 'uri' => 'public://DRUPLICON.txt', @@ -68,7 +68,16 @@ function testFileSave() { 'changed' => 1, 'status' => FILE_STATUS_PERMANENT, )); - file_put_contents($file->getFileUri(), 'hello world'); - $file->save(); + file_put_contents($uppercase_file->getFileUri(), 'hello world'); + $uppercase_file->save(); + + // Ensure that file URI entity queries are case sensitive. + $fids = \Drupal::entityQuery('file') + ->condition('uri', $uppercase_file->getFileUri()) + ->execute(); + + $this->assertEqual(1, count($fids)); + $this->assertEqual(array($uppercase_file->id() => $uppercase_file->id()), $fids); + } }