From 8f2485a57b7e08c916738fbed927d4bc65b98542 Mon Sep 17 00:00:00 2001 From: mohs8421 Date: Tue, 16 May 2023 23:47:50 +0200 Subject: [PATCH 1/2] Addressing the issue mentioned here: https://github.com/SeaQL/sea-orm/discussions/1620 The to use the typed builder is good, but in the given case it is better to ensure the query cannot fail by providing a name, where it is needed. --- src/backend/mysql/index.rs | 22 ++++++++++++---------- src/index/create.rs | 10 ++++++++++ tests/mysql/index.rs | 12 ++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) 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..1d970933a 100644 --- a/src/index/create.rs +++ b/src/index/create.rs @@ -229,6 +229,16 @@ 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!( From 021f99cd680b2bb895775024151537d3f0fa22c9 Mon Sep 17 00:00:00 2001 From: mohs8421 Date: Wed, 17 May 2023 09:37:25 +0200 Subject: [PATCH 2/2] Fixing format --- src/index/create.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index/create.rs b/src/index/create.rs index 1d970933a..6f0f6bbfa 100644 --- a/src/index/create.rs +++ b/src/index/create.rs @@ -235,7 +235,11 @@ impl IndexCreateStatement { } let prefix = if self.is_primary_key() { "pri" - } else if self.is_unique_key() { "uni" } else { "idx" }; + } else if self.is_unique_key() { + "uni" + } else { + "idx" + }; format!("{}-{}", prefix, self.index.get_column_names().join("-")) }