protected function Schema::getNormalizedIndexes in Drupal 10
Gets normalized indexes from a table specification.
Shortens indexes to 191 characters if they apply to utf8mb4-encoded fields, in order to comply with the InnoDB index limitation of 756 bytes.
Parameters
array $spec: The table specification.
Return value
array List of shortened indexes.
Throws
\Drupal\Core\Database\SchemaException Thrown if field specification is missing.
2 calls to Schema::getNormalizedIndexes()
- Schema::addIndex in core/
modules/ mysql/ src/ Driver/ Database/ mysql/ Schema.php - Add an index.
- Schema::createKeysSql in core/
modules/ mysql/ src/ Driver/ Database/ mysql/ Schema.php
File
- core/
modules/ mysql/ src/ Driver/ Database/ mysql/ Schema.php, line 315
Class
- Schema
- MySQL implementation of \Drupal\Core\Database\Schema.
Namespace
Drupal\mysql\Driver\Database\mysqlCode
protected function getNormalizedIndexes(array $spec) {
$indexes = $spec['indexes'] ?? [];
foreach ($indexes as $index_name => $index_fields) {
foreach ($index_fields as $index_key => $index_field) {
// Get the name of the field from the index specification.
$field_name = is_array($index_field) ? $index_field[0] : $index_field;
// Check whether the field is defined in the table specification.
if (isset($spec['fields'][$field_name])) {
// Get the MySQL type from the processed field.
$mysql_field = $this
->processField($spec['fields'][$field_name]);
if (in_array($mysql_field['mysql_type'], $this->mysqlStringTypes)) {
// Check whether we need to shorten the index.
if ((!isset($mysql_field['type']) || $mysql_field['type'] != 'varchar_ascii') && (!isset($mysql_field['length']) || $mysql_field['length'] > 191)) {
// Limit the index length to 191 characters.
$this
->shortenIndex($indexes[$index_name][$index_key]);
}
}
}
else {
throw new SchemaException("MySQL needs the '{$field_name}' field specification in order to normalize the '{$index_name}' index");
}
}
}
return $indexes;
}