diff --git a/migration-engine/connectors/sql-migration-connector/src/flavour.rs b/migration-engine/connectors/sql-migration-connector/src/flavour.rs index 7eaf0f23b794..d27832e1ef67 100644 --- a/migration-engine/connectors/sql-migration-connector/src/flavour.rs +++ b/migration-engine/connectors/sql-migration-connector/src/flavour.rs @@ -124,6 +124,11 @@ pub(crate) trait SqlFlavour: None } + /// Check a schema for preview features not implemented in migrate/introspection. + fn check_schema_features(&self, _schema: &psl::ValidatedSchema) -> ConnectorResult<()> { + Ok(()) + } + /// The connection string received in set_params(). fn connection_string(&self) -> Option<&str>; diff --git a/migration-engine/connectors/sql-migration-connector/src/flavour/mysql.rs b/migration-engine/connectors/sql-migration-connector/src/flavour/mysql.rs index 3ae6d310ad5f..ad624214c0cd 100644 --- a/migration-engine/connectors/sql-migration-connector/src/flavour/mysql.rs +++ b/migration-engine/connectors/sql-migration-connector/src/flavour/mysql.rs @@ -139,6 +139,21 @@ impl SqlFlavour for MysqlFlavour { } } + fn check_schema_features(&self, schema: &psl::ValidatedSchema) -> ConnectorResult<()> { + let has_namespaces = schema + .configuration + .datasources + .first() + .map(|ds| !ds.namespaces.is_empty()); + if let Some(true) = has_namespaces { + Err(ConnectorError::from_msg( + "multiSchema migrations and introspection are not implemented on MySQL yet".to_owned(), + )) + } else { + Ok(()) + } + } + fn connection_string(&self) -> Option<&str> { self.state .params() diff --git a/migration-engine/connectors/sql-migration-connector/src/lib.rs b/migration-engine/connectors/sql-migration-connector/src/lib.rs index 959265f6d51c..ee6d43a4534d 100644 --- a/migration-engine/connectors/sql-migration-connector/src/lib.rs +++ b/migration-engine/connectors/sql-migration-connector/src/lib.rs @@ -123,6 +123,7 @@ impl SqlMigrationConnector { match target { DiffTarget::Datamodel(schema) => { let schema = psl::parse_schema(schema).map_err(ConnectorError::new_schema_parser_error)?; + self.flavour.check_schema_features(&schema)?; Ok(sql_schema_calculator::calculate_sql_schema( &schema, self.flavour.as_ref(), diff --git a/migration-engine/core/src/lib.rs b/migration-engine/core/src/lib.rs index 6e9bd2dc1ead..ac9aab570af4 100644 --- a/migration-engine/core/src/lib.rs +++ b/migration-engine/core/src/lib.rs @@ -169,7 +169,13 @@ pub fn migration_api( ) -> CoreResult> { // Eagerly load the default schema, for validation errors. if let Some(datamodel) = &datamodel { - parse_configuration(datamodel)?; + let (ds, _, _, _) = parse_configuration(datamodel)?; + + if ds.active_provider == "mysql" && !ds.namespaces.is_empty() { + return Err(CoreError::from_msg( + "multiSchema migrations and introspection are not implemented on MySQL yet".to_owned(), + )); + } } let state = state::EngineState::new(datamodel, host); diff --git a/migration-engine/migration-engine-tests/tests/schema_push/mod.rs b/migration-engine/migration-engine-tests/tests/schema_push/mod.rs index 64816ddb41af..eb6f668919cf 100644 --- a/migration-engine/migration-engine-tests/tests/schema_push/mod.rs +++ b/migration-engine/migration-engine-tests/tests/schema_push/mod.rs @@ -454,3 +454,36 @@ fn issue_repro_extended_indexes(api: TestApi) { api.schema_push_w_datasource(dm).send().assert_executable(); api.schema_push_w_datasource(dm).send().assert_green().assert_no_steps(); } + +#[test] +fn multi_schema_not_implemented_on_mysql() { + test_setup::only!(Mysql); + + let schema = r#" +generator client { + provider = "prisma-client-js" + previewFeatures = ["multiSchema"] +} + +datasource db { + provider = "mysql" + url = env("TEST_DATABASE_URL") + schemas = ["s1", "s2"] +} + +model m1 { + id Int @id + @@schema("s2") +} + "#; + + let api = migration_core::migration_api(Some(schema.to_owned()), None).unwrap(); + let err = tok(api.schema_push(migration_core::json_rpc::types::SchemaPushInput { + force: false, + schema: schema.to_owned(), + })) + .unwrap_err(); + + let expected = expect_test::expect![[""]]; + expected.assert_eq(&err.to_string()); +}