Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update MySqlCommandInterpreter.cs #8826

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 31 additions & 4 deletions src/Orchard/Data/Migration/Interpreters/MySqlCommandInterpreter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,47 @@ public string[] CreateStatements(AddIndexCommand command) {
using (var sqlCommand = session.Connection.CreateCommand()) {
var columnNames = String.Join(", ", command.ColumnNames.Select(c => string.Format("'{0}'", c)));
var tableName = PrefixTableName(command.TableName);
var columnList = command.ColumnNames.ToList();
var indexMaximumLenght = 767;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indexMaximumLenght => indexMaximumLength

var longColumnNames = new List<string>();

if (columnList.Count > 1) {
string sqlComplicatedIndexes = @"SELECT SUM(CHARACTER_MAXIMUM_LENGTH) FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '{1}' AND COLUMN_NAME in ({0}) AND TABLE_SCHEMA = '{2}' AND
(Data_type = 'varchar');";
sqlComplicatedIndexes = string.Format(sqlComplicatedIndexes, columnNames, tableName, session.Connection.Database);
sqlCommand.CommandText = sqlComplicatedIndexes;
using (var reader = sqlCommand.ExecuteReader()) {
reader.Read();
if (!reader.IsDBNull(0)) {
var characterMaximumLenght = reader.GetInt32(0);
indexMaximumLenght -= characterMaximumLenght;
if (indexMaximumLenght < 0) {
throw new InvalidOperationException("Cannot create index because indexMaximumLenght less than 0");
}
}
}
}
// check whether the index contains big nvarchar columns or text fields
string sql = @"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '{1}' AND COLUMN_NAME in ({0}) AND TABLE_SCHEMA = '{2}' AND
((Data_type = 'varchar' and CHARACTER_MAXIMUM_LENGTH > 767) OR data_type= 'text');";

sql = string.Format(sql, columnNames, tableName, session.Connection.Database);
sqlCommand.CommandText = sql;

var columnList = command.ColumnNames.ToList();
using (var reader = sqlCommand.ExecuteReader()) {
// Provide prefix for string columns with length longer than 767
while (reader.Read()) {
var columnName = reader.GetString(0);
columnList[columnList.IndexOf(columnName)] = string.Format("{0}(767)", columnName);
longColumnNames.Add(columnName);
}

}

if (longColumnNames.Count > 0) {
var columnPrefixKeyPartLenght = indexMaximumLenght / longColumnNames.Count;
foreach (var columnName in longColumnNames) {
columnList[columnList.IndexOf(columnName)] = string.Format("{0}({1})", columnName, columnPrefixKeyPartLenght);
}
}

Expand All @@ -116,4 +143,4 @@ public string[] CreateStatements(AddIndexCommand command) {
}
}
}
}
}