diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php index 59cad4423abebd58ed744776d6c775a3d0aa4e34..cfe0736b1569200e4e392ad59616bb83f7e9d93a 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php @@ -1621,7 +1621,7 @@ protected function updateSharedTableSchema(FieldStorageDefinitionInterface $stor } $column_schema = $original_schema[$table_name]['fields'][$column_name]; $column_schema['not null'] = $not_null; - $schema_handler->changeField($table_name, $field_name, $field_name, $column_schema); + $schema_handler->changeField($table_name, $column_name, $column_name, $column_schema); } } diff --git a/core/tests/Drupal/KernelTests/Core/Entity/Sql/SqlContentEntityStorageSchemaTest.php b/core/tests/Drupal/KernelTests/Core/Entity/Sql/SqlContentEntityStorageSchemaTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6a5a96767a2095f101889599c0d8225021c8671b --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Entity/Sql/SqlContentEntityStorageSchemaTest.php @@ -0,0 +1,130 @@ +container->get('keyvalue'); + $this->installedStorageSchema = $key_value_factory->get('entity.storage_schema.sql'); + $this->entityDefinitionUpdateManager = $this->container->get('entity.definition_update_manager'); + } + + /** + * Tests updating a shared table field definition. + */ + public function testOnFieldStorageDefinitionUpdateShared() { + // Install the test entity type with an additional field. Use a multi-column + // field so that field name and column name(s) do not match. + $field = BaseFieldDefinition::create('shape') + // Avoid creating a foreign key which is irrelevant for this test. + ->setSetting('foreign_key_name', NULL) + ->setName('shape') + ->setProvider('entity_test'); + $this->state->set('entity_test.additional_base_field_definitions', [ + 'shape' => $field, + ]); + $this->entityDefinitionUpdateManager->installFieldStorageDefinition( + 'shape', + 'entity_test', + 'entity_test', + $field + ); + + // Make sure the field is not marked as NOT NULL initially. + $expected = [ + 'entity_test' => [ + 'fields' => [ + 'shape__shape' => [ + 'type' => 'varchar', + 'length' => 32, + 'not null' => FALSE, + ], + 'shape__color' => [ + 'type' => 'varchar', + 'length' => 32, + 'not null' => FALSE, + ], + ], + ], + ]; + $actual = $this->installedStorageSchema->get('entity_test.field_schema_data.shape'); + $this->assertSame($expected, $actual); + + // Make the field an entity key, so that it will get marked as NOT NULL. + $entity_type = $this->entityDefinitionUpdateManager->getEntityType('entity_test'); + $original_keys = $entity_type->getKeys(); + $entity_type->set('entity_keys', $original_keys + ['shape' => 'shape']); + $this->entityDefinitionUpdateManager->updateEntityType($entity_type); + + // Update the field and make sure the schema got updated. + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($field); + $expected['entity_test']['fields']['shape__shape']['not null'] = TRUE; + $expected['entity_test']['fields']['shape__color']['not null'] = TRUE; + $actual = $this->installedStorageSchema->get('entity_test.field_schema_data.shape'); + $this->assertSame($expected, $actual); + + // Remove the entity key again and check that the schema got reverted. + $entity_type->set('entity_keys', $original_keys); + $this->entityDefinitionUpdateManager->updateEntityType($entity_type); + + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($field); + $expected['entity_test']['fields']['shape__shape']['not null'] = FALSE; + $expected['entity_test']['fields']['shape__color']['not null'] = FALSE; + $actual = $this->installedStorageSchema->get('entity_test.field_schema_data.shape'); + $this->assertSame($expected, $actual); + + // Now add an entity and repeat the process. + $entity_storage = $this->entityManager->getStorage('entity_test'); + $entity_storage->create([ + 'shape' => [ + 'shape' => 'rectangle', + 'color' => 'pink', + ], + ])->save(); + + $entity_type->set('entity_keys', $original_keys + ['shape' => 'shape']); + $this->entityDefinitionUpdateManager->updateEntityType($entity_type); + + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($field); + $expected['entity_test']['fields']['shape__shape']['not null'] = TRUE; + $expected['entity_test']['fields']['shape__color']['not null'] = TRUE; + $actual = $this->installedStorageSchema->get('entity_test.field_schema_data.shape'); + $this->assertSame($expected, $actual); + + $entity_type->set('entity_keys', $original_keys); + $this->entityDefinitionUpdateManager->updateEntityType($entity_type); + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($field); + $expected['entity_test']['fields']['shape__shape']['not null'] = FALSE; + $expected['entity_test']['fields']['shape__color']['not null'] = FALSE; + $actual = $this->installedStorageSchema->get('entity_test.field_schema_data.shape'); + $this->assertSame($expected, $actual); + } + +}