From 4e077035a26b7515646ba8c2dd203437342737a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Houl=C3=A9?= <13155277+tomhoule@users.noreply.github.com> Date: Fri, 16 Dec 2022 16:28:12 +0100 Subject: [PATCH] qe: fix implicit many-to-many relations in multiSchema context (#3523) We did not add any schema prefix there. We now add the correct one (the schema of the first model). closes https://github.com/prisma/prisma/issues/16761 --- ...join_table_is_in_first_model_schema.prisma | 64 +++++++++++++++++++ .../tests/new/multi_schema.rs | 34 ++++++++++ .../src/model_extensions/relation.rs | 7 +- 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 migration-engine/migration-engine-tests/tests/single_migration_tests/postgres/multi_schema_implicit_many_to_many_join_table_is_in_first_model_schema.prisma diff --git a/migration-engine/migration-engine-tests/tests/single_migration_tests/postgres/multi_schema_implicit_many_to_many_join_table_is_in_first_model_schema.prisma b/migration-engine/migration-engine-tests/tests/single_migration_tests/postgres/multi_schema_implicit_many_to_many_join_table_is_in_first_model_schema.prisma new file mode 100644 index 000000000000..ec691474cc80 --- /dev/null +++ b/migration-engine/migration-engine-tests/tests/single_migration_tests/postgres/multi_schema_implicit_many_to_many_join_table_is_in_first_model_schema.prisma @@ -0,0 +1,64 @@ +// tags=postgres +// exclude=cockroachdb + +datasource testds { + provider = "postgresql" + url = env("TEST_DATABASE_URL") + schemas = ["veggies", "roots"] +} + +generator js { + provider = "prisma-client-js" + previewFeatures = ["multiSchema"] +} + +model zoodles { + id Int @id + shiratakies shirataki[] + @@schema("veggies") +} + +model shirataki { + id Int @id + zoodles zoodles[] + @@schema("roots") +} + +// Expected Migration: +// -- CreateSchema +// CREATE SCHEMA IF NOT EXISTS "roots"; +// +// -- CreateSchema +// CREATE SCHEMA IF NOT EXISTS "veggies"; +// +// -- CreateTable +// CREATE TABLE "veggies"."zoodles" ( +// "id" INTEGER NOT NULL, +// +// CONSTRAINT "zoodles_pkey" PRIMARY KEY ("id") +// ); +// +// -- CreateTable +// CREATE TABLE "roots"."shirataki" ( +// "id" INTEGER NOT NULL, +// +// CONSTRAINT "shirataki_pkey" PRIMARY KEY ("id") +// ); +// +// -- CreateTable +// CREATE TABLE "roots"."_shiratakiTozoodles" ( +// "A" INTEGER NOT NULL, +// "B" INTEGER NOT NULL +// ); +// +// -- CreateIndex +// CREATE UNIQUE INDEX "_shiratakiTozoodles_AB_unique" ON "roots"."_shiratakiTozoodles"("A", "B"); +// +// -- CreateIndex +// CREATE INDEX "_shiratakiTozoodles_B_index" ON "roots"."_shiratakiTozoodles"("B"); +// +// -- AddForeignKey +// ALTER TABLE "roots"."_shiratakiTozoodles" ADD CONSTRAINT "_shiratakiTozoodles_A_fkey" FOREIGN KEY ("A") REFERENCES "roots"."shirataki"("id") ON DELETE CASCADE ON UPDATE CASCADE; +// +// -- AddForeignKey +// ALTER TABLE "roots"."_shiratakiTozoodles" ADD CONSTRAINT "_shiratakiTozoodles_B_fkey" FOREIGN KEY ("B") REFERENCES "veggies"."zoodles"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/multi_schema.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/multi_schema.rs index 34a6504afd5b..10d7c376b38e 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/multi_schema.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/multi_schema.rs @@ -25,6 +25,26 @@ mod multi_schema { schema.to_owned() } + pub fn multi_schema_implicit_m2m() -> String { + let schema = indoc! { + r#" + model Loop { + id Int @id + fruits Fruit[] + @@schema("shapes") + } + + model Fruit { + id Int @id + loops Loop[] + @@schema("objects") + } + "# + }; + + schema.to_owned() + } + #[connector_test(schema(multi_schema_simple), db_schemas("schema1", "schema2"))] async fn crud_simple(runner: Runner) -> TestResult<()> { // CREATE @@ -516,4 +536,18 @@ mod multi_schema { Ok(()) } + + #[connector_test(schema(multi_schema_implicit_m2m), db_schemas("shapes", "objects"))] + async fn implicit_m2m_simple(runner: Runner) -> TestResult<()> { + let result = runner + .query(r#"mutation { createOneFruit(data: { id: 1, loops: { create: [{ id: 11 }, { id: 12 }] }}) { id loops { id } } }"#) + .await?; + result.assert_success(); + let result = result.to_string(); + assert_eq!( + result, + "{\"data\":{\"createOneFruit\":{\"id\":1,\"loops\":[{\"id\":11},{\"id\":12}]}}}" + ); + Ok(()) + } } diff --git a/query-engine/connectors/sql-query-connector/src/model_extensions/relation.rs b/query-engine/connectors/sql-query-connector/src/model_extensions/relation.rs index 28d8476c936b..af34bfb38ecd 100644 --- a/query-engine/connectors/sql-query-connector/src/model_extensions/relation.rs +++ b/query-engine/connectors/sql-query-connector/src/model_extensions/relation.rs @@ -67,8 +67,11 @@ impl AsTable for Relation { // table, so MSSQL can convert the `INSERT .. ON CONFLICT IGNORE` into // a `MERGE` statement. RelationLinkManifestation::RelationTable(ref m) => { - let db = self.model_a().internal_data_model().db_name.clone(); - let table: Table = (db, m.table.clone()).into(); + let model_a = self.model_a(); + let prefix = model_a + .schema_name() + .unwrap_or_else(|| model_a.internal_data_model().db_name.clone()); + let table: Table = (prefix, m.table.clone()).into(); table.add_unique_index(vec![Column::from("A"), Column::from("B")]) }