diff --git a/src/backend/mysql/index.rs b/src/backend/mysql/index.rs index 207a300f9..cd2213415 100644 --- a/src/backend/mysql/index.rs +++ b/src/backend/mysql/index.rs @@ -1,5 +1,7 @@ use super::*; +const MYSQL_IDENTIFIER_NAME_MAX_LENGTH: usize = 64; + impl IndexBuilder for MysqlQueryBuilder { fn prepare_table_index_expression( &self, @@ -37,16 +39,16 @@ impl IndexBuilder for MysqlQueryBuilder { self.prepare_index_prefix(create, sql); write!(sql, "INDEX ").unwrap(); - if let Some(name) = &create.index.name { - write!( - sql, - "{}{}{}", - self.quote().left(), - name, - self.quote().right() - ) - .unwrap(); - } + let mut name = create.get_name(); + name.truncate(MYSQL_IDENTIFIER_NAME_MAX_LENGTH); + write!( + sql, + "{}{}{}", + self.quote().left(), + name, + self.quote().right() + ) + .unwrap(); write!(sql, " ON ").unwrap(); if let Some(table) = &create.table { diff --git a/src/index/create.rs b/src/index/create.rs index ce094d4df..6f0f6bbfa 100644 --- a/src/index/create.rs +++ b/src/index/create.rs @@ -229,6 +229,20 @@ impl IndexCreateStatement { &self.index } + pub(crate) fn get_name(&self) -> String { + if let Some(name) = self.index.name.clone() { + return name; + } + let prefix = if self.is_primary_key() { + "pri" + } else if self.is_unique_key() { + "uni" + } else { + "idx" + }; + format!("{}-{}", prefix, self.index.get_column_names().join("-")) + } + pub fn take(&mut self) -> Self { Self { table: self.table.take(), diff --git a/tests/mysql/index.rs b/tests/mysql/index.rs index 4c7b8d462..6e0e18014 100644 --- a/tests/mysql/index.rs +++ b/tests/mysql/index.rs @@ -53,6 +53,18 @@ fn create_4() { ); } +#[test] +fn create_without_name() { + assert_eq!( + Index::create() + .index_type(IndexType::Hash) + .table(Glyph::Table) + .col(Glyph::Image) + .to_string(MysqlQueryBuilder), + "CREATE INDEX `idx-image` ON `glyph` (`image`) USING HASH" + ); +} + #[test] fn drop_1() { assert_eq!(