From 4525cbe0ed1f906a64259f9d35e7e9eb524a2dbd Mon Sep 17 00:00:00 2001 From: Julius de Bruijn Date: Mon, 2 Aug 2021 16:58:58 +0200 Subject: [PATCH] SQL Server: Reset should clear UDTs --- .../src/test_api.rs | 1 + .../src/flavour/mssql.rs | 19 +++++++++++++ .../src/sql_renderer/mssql_renderer.rs | 2 +- .../src/sync_test_api.rs | 13 ++++++++- .../tests/migrations/mssql.rs | 27 +++++++++++++++++++ 5 files changed, 60 insertions(+), 2 deletions(-) diff --git a/introspection-engine/introspection-engine-tests/src/test_api.rs b/introspection-engine/introspection-engine-tests/src/test_api.rs index 9842705351f6..ee4711139ebc 100644 --- a/introspection-engine/introspection-engine-tests/src/test_api.rs +++ b/introspection-engine/introspection-engine-tests/src/test_api.rs @@ -37,6 +37,7 @@ impl TestApi { let me = SqlMigrationConnector::new(connection_string, preview_features, None) .await .unwrap(); + me.reset().await.unwrap(); ( diff --git a/migration-engine/connectors/sql-migration-connector/src/flavour/mssql.rs b/migration-engine/connectors/sql-migration-connector/src/flavour/mssql.rs index a1a2bfacfd7d..83eb8d9de5bd 100644 --- a/migration-engine/connectors/sql-migration-connector/src/flavour/mssql.rs +++ b/migration-engine/connectors/sql-migration-connector/src/flavour/mssql.rs @@ -296,11 +296,30 @@ impl SqlFlavour for MssqlFlavour { schema_name ); + let drop_types = format!( + r#" + DECLARE @stmt NVARCHAR(max) + DECLARE @n CHAR(1) + + SET @n = CHAR(10) + + SELECT @stmt = ISNULL(@stmt + @n, '') + + 'DROP TYPE [' + SCHEMA_NAME(schema_id) + '].[' + name + ']' + FROM sys.types + WHERE SCHEMA_NAME(schema_id) = '{0}' + AND is_user_defined = 1 + + EXEC SP_EXECUTESQL @stmt + "#, + schema_name + ); + connection.raw_cmd(&drop_procedures).await?; connection.raw_cmd(&drop_views).await?; connection.raw_cmd(&drop_shared_defaults).await?; connection.raw_cmd(&drop_fks).await?; connection.raw_cmd(&drop_tables).await?; + connection.raw_cmd(&drop_types).await?; Ok(()) } diff --git a/migration-engine/connectors/sql-migration-connector/src/sql_renderer/mssql_renderer.rs b/migration-engine/connectors/sql-migration-connector/src/sql_renderer/mssql_renderer.rs index 2249f8739088..fae11f73abe1 100644 --- a/migration-engine/connectors/sql-migration-connector/src/sql_renderer/mssql_renderer.rs +++ b/migration-engine/connectors/sql-migration-connector/src/sql_renderer/mssql_renderer.rs @@ -393,7 +393,7 @@ impl SqlRenderer for MssqlFlavour { } fn render_drop_user_defined_type(&self, udt: &UserDefinedTypeWalker<'_>) -> String { - todo!("DROP TYPE {}", self.quote_with_schema(udt.name())) + format!("DROP TYPE {}", self.quote_with_schema(udt.name())) } fn render_begin_transaction(&self) -> Option<&'static str> { diff --git a/migration-engine/migration-engine-tests/src/sync_test_api.rs b/migration-engine/migration-engine-tests/src/sync_test_api.rs index dcaf6052fa57..8af77965f192 100644 --- a/migration-engine/migration-engine-tests/src/sync_test_api.rs +++ b/migration-engine/migration-engine-tests/src/sync_test_api.rs @@ -5,7 +5,10 @@ pub use test_setup::{BitFlags, Capabilities, Tags}; use crate::{commands::*, multi_engine_test_api::TestApi as RootTestApi}; use migration_connector::MigrationPersistence; -use quaint::prelude::{ConnectionInfo, ResultSet}; +use quaint::{ + prelude::{ConnectionInfo, ResultSet}, + Value, +}; use sql_migration_connector::SqlMigrationConnector; use std::{borrow::Cow, future::Future}; use tempfile::TempDir; @@ -196,6 +199,14 @@ impl TestApi { self.root.block_on(self.connector.queryable().query(q)).unwrap() } + /// Like quaint::Queryable::query_raw() + #[track_caller] + pub fn query_raw(&self, q: &str, params: &[Value<'static>]) -> ResultSet { + self.root + .block_on(self.connector.queryable().query_raw(q, params)) + .unwrap() + } + /// Send a SQL command to the database, and expect it to succeed. #[track_caller] pub fn raw_cmd(&self, sql: &str) { diff --git a/migration-engine/migration-engine-tests/tests/migrations/mssql.rs b/migration-engine/migration-engine-tests/tests/migrations/mssql.rs index 23f20911147f..605acb993e9b 100644 --- a/migration-engine/migration-engine-tests/tests/migrations/mssql.rs +++ b/migration-engine/migration-engine-tests/tests/migrations/mssql.rs @@ -1,5 +1,32 @@ use migration_engine_tests::sync_test_api::*; +#[test_connector(tags(Mssql))] +fn reset_clears_udts(api: TestApi) { + let schema = api.schema_name(); + + api.raw_cmd(&format!("CREATE TYPE {}.[testType] AS TABLE (FooBar INT)", schema)); + + let schemas = api.query_raw( + &format!( + "SELECT * FROM sys.types WHERE SCHEMA_NAME(schema_id) = '{}' and NAME = 'testType'", + schema + ), + &[], + ); + assert_eq!(1, schemas.len()); + + api.reset().send_sync(); + + let schemas = api.query_raw( + &format!( + "SELECT * FROM sys.types WHERE SCHEMA_NAME(schema_id) = '{}' and NAME = 'testType'", + schema + ), + &[], + ); + assert_eq!(0, schemas.len()); +} + #[test_connector(tags(Mssql))] fn shared_default_constraints_are_ignored_issue_5423(api: TestApi) { let schema = api.schema_name();