diff -u b/core/modules/system/system.install b/core/modules/system/system.install --- b/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -1227,14 +1227,34 @@ $entity_installed_schema = \Drupal::keyValue('entity.storage_schema.sql'); foreach (array_keys($entity_manager->getDefinitions()) as $entity_type_id) { if (($schema_data = $entity_installed_schema->get($entity_type_id . '.entity_schema_data')) && ($entity_type = $entity_manager->getLastInstalledDefinition($entity_type_id))) { + $id_field_name = $entity_type->getKey('id'); + $default_langcode_field_name = $entity_type->getKey('default_langcode'); + $langcode_field_name = $entity_type->getKey('langcode'); + $index_name = $entity_type_id . '__id__default_langcode__langcode'; - $index_spec = [$entity_type->getKey('id'), $entity_type->getKey('default_langcode'), $entity_type->getKey('langcode')]; + $index_fields = [$id_field_name, $default_langcode_field_name, $langcode_field_name]; + + // \Drupal\Core\Database\Schema::addIndex() requires some schema + // information about the fields being indexed in order to ensure that the + // index length isn't longer than the database allows. Here, we assume + // that for all entity types whose schema is managed by + // SqlContentEntityStorageSchema, that the field type plugin is: + // - 'integer': for the 'id' entity key field. + // - 'boolean': for the 'default_langcode' entity key field. + // - 'language': for the 'langcode' entity key field. + // The values below are what was returned by those field type plugins' + // schema() method at the time this update function was written. + $index_fields_spec = [ + $id_field_name => ['type' => 'int', 'size' => 'normal'], + $default_langcode_field_name => ['type' => 'int', 'size' => 'tiny'], + $langcode_field_name => ['type' => 'varchar', 'length' => 12, 'is_ascii' => TRUE], + ]; $new_schema_data = $schema_data; foreach ([$entity_type->getDataTable() ?: $entity_type_id . '_field_data', $entity_type->getRevisionDataTable() ?: $entity_type_id . '_field_revision'] as $table_name) { if (isset($schema_data[$table_name]) && !isset($schema_data[$table_name]['indexes'][$index_name]) && $db_schema->tableExists($table_name)) { - $db_schema->addIndex($table_name, $index_name, $index_spec); - $new_schema_data[$table_name]['indexes'][$index_name] = $index_spec; + $db_schema->addIndex($table_name, $index_name, $index_fields, ['fields' => $index_fields_spec]); + $new_schema_data[$table_name]['indexes'][$index_name] = $index_fields; } } if ($new_schema_data != $schema_data) {