diff --git a/.github/workflows/test-driver-adapters-template.yml b/.github/workflows/test-driver-adapters-template.yml index d1f6f54aa6c5..a4a6580b3c48 100644 --- a/.github/workflows/test-driver-adapters-template.yml +++ b/.github/workflows/test-driver-adapters-template.yml @@ -5,6 +5,9 @@ on: setup_task: type: string required: true + relation_load_strategy: + type: string + default: '["join", "query"]' jobs: select_prisma_branch: @@ -12,7 +15,7 @@ jobs: uses: ./.github/workflows/select-prisma-branch.yml rust-query-engine-tests: - name: '${{ matrix.partition }}' + name: ${{ matrix.relation_load_strategy }} ${{ matrix.partition }} needs: select_prisma_branch strategy: @@ -20,6 +23,8 @@ jobs: matrix: node_version: ['20'] partition: ['1/4', '2/4', '3/4', '4/4'] + relation_load_strategy: ${{ fromJson(inputs.relation_load_strategy) }} + env: LOG_LEVEL: 'info' # Set to "debug" to trace the query engine and node process running the driver adapter LOG_QUERIES: 'y' @@ -32,6 +37,7 @@ jobs: QUERY_BATCH_SIZE: '10' WASM_BUILD_PROFILE: 'profiling' # Include debug info for proper backtraces WORKSPACE_ROOT: ${{ github.workspace }} + PRISMA_RELATION_LOAD_STRATEGY: ${{ matrix.relation_load_strategy }} runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test-query-compiler.yml b/.github/workflows/test-query-compiler.yml index a82034eb20f8..8ef8bbe4e9f4 100644 --- a/.github/workflows/test-query-compiler.yml +++ b/.github/workflows/test-query-compiler.yml @@ -55,6 +55,10 @@ jobs: - name: mariadb setup_task: dev-mariadb-qc + relation_load_strategy: '["query"]' + + - name: mariadb-mysql + setup_task: dev-mariadb-mysql-qc relation_load_strategy: '["join", "query"]' - name: pg-cockroachdb diff --git a/.github/workflows/test-query-engine.yml b/.github/workflows/test-query-engine.yml index 2ad1e7c8f752..dd5e5b7b4b48 100644 --- a/.github/workflows/test-query-engine.yml +++ b/.github/workflows/test-query-engine.yml @@ -229,17 +229,25 @@ jobs: setup_task: 'dev-neon-wasm' - name: 'libsql (wasm)' setup_task: 'dev-libsql-wasm' + relation_load_strategy: '["query"]' - name: 'd1 (wasm)' setup_task: 'dev-d1' + relation_load_strategy: '["query"]' - name: 'better-sqlite3 (wasm)' setup_task: 'dev-better-sqlite3-wasm' + relation_load_strategy: '["query"]' - name: 'mssql (wasm)' setup_task: 'dev-mssql-wasm' + relation_load_strategy: '["query"]' - name: 'mariadb (wasm)' setup_task: 'dev-mariadb-wasm' + relation_load_strategy: '["query"]' + - name: 'mariadb-mysql (wasm)' + setup_task: 'dev-mariadb-mysql-wasm' - name: 'pg-cockroachdb (wasm)' setup_task: 'dev-pg-cockroachdb-wasm' name: ${{ matrix.adapter.name }} uses: ./.github/workflows/test-driver-adapters-template.yml with: setup_task: ${{ matrix.adapter.setup_task }} + relation_load_strategy: ${{ matrix.adapter.relation_load_strategy }} diff --git a/Makefile b/Makefile index bcb9e2d019b5..49c08bd5780a 100644 --- a/Makefile +++ b/Makefile @@ -496,12 +496,25 @@ test-planetscale-qc: dev-planetscale-qc test-qe-st test-driver-adapter-planetscale: test-planetscale-js test-driver-adapter-planetscale-wasm: test-planetscale-wasm -dev-mariadb-wasm: start-mysql_8 build-qe-wasm build-driver-adapters-kit-qe +dev-mariadb-mysql-wasm: start-mysql_8 build-qe-wasm build-driver-adapters-kit-qe + cp $(CONFIG_PATH)/mariadb-mysql-wasm $(CONFIG_FILE) + +test-mariadb-mysql-wasm: dev-mariadb-mysql-wasm test-qe-st + +dev-mariadb-mysql-qc: start-mysql_8 build-qc-wasm build-driver-adapters-kit-qc + cp $(CONFIG_PATH)/mariadb-mysql-qc $(CONFIG_FILE) + +test-mariadb-mysql-qc: dev-mariadb-mysql-qc test-qe-st + +test-driver-adapter-mariadb-mysql: test-mariadb-mysql-js +test-driver-adapter-mariadb-mysql-wasm: test-mariadb-mysql-wasm + +dev-mariadb-wasm: start-mysql_mariadb build-qe-wasm build-driver-adapters-kit-qe cp $(CONFIG_PATH)/mariadb-wasm $(CONFIG_FILE) test-mariadb-wasm: dev-mariadb-wasm test-qe-st -dev-mariadb-qc: start-mysql_8 build-qc-wasm build-driver-adapters-kit-qc +dev-mariadb-qc: start-mysql_mariadb build-qc-wasm build-driver-adapters-kit-qc cp $(CONFIG_PATH)/mariadb-qc $(CONFIG_FILE) test-mariadb-qc: dev-mariadb-qc test-qe-st diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/better-sqlite3.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/better-sqlite3.ts index 6d1524f952ca..820abe8c1aa1 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/better-sqlite3.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/better-sqlite3.ts @@ -34,8 +34,7 @@ export class BetterSQLite3Manager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/d1.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/d1.ts index f6d4237e8d99..d993aa64f872 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/d1.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/d1.ts @@ -63,8 +63,7 @@ export class D1Manager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/libsql.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/libsql.ts index 9dc5cd29267b..2ebbfe9d9837 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/libsql.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/libsql.ts @@ -35,8 +35,7 @@ export class LibSQLManager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/mariadb.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/mariadb.ts index 6409f6029e92..9428d868c7bd 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/mariadb.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/mariadb.ts @@ -32,8 +32,7 @@ export class MariaDbManager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { @@ -56,6 +55,6 @@ function mariadbOptions(urlStr: string) { database, host, port: Number(port), - connectionLimit: 4, + connectionLimit: 2, } } diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/mssql.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/mssql.ts index 266d388400f0..f2e88aa4eec2 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/mssql.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/mssql.ts @@ -33,8 +33,7 @@ export class MssqlManager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/neon.ws.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/neon.ws.ts index f45333c6cf37..0d5fa103b646 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/neon.ws.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/neon.ws.ts @@ -46,9 +46,7 @@ export class NeonWsManager implements DriverAdaptersManager { neonConfig.useSecureWebSocket = false neonConfig.pipelineConnect = false - this.#adapter = await this.#factory.connect() - - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/pg.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/pg.ts index d55bacdd32d5..a5cf9a8cda04 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/pg.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/pg.ts @@ -36,8 +36,7 @@ export class PgManager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() { diff --git a/libs/driver-adapters/executor/src/driver-adapters-manager/planetscale.ts b/libs/driver-adapters/executor/src/driver-adapters-manager/planetscale.ts index 2183c94dec8f..802d8a903aac 100644 --- a/libs/driver-adapters/executor/src/driver-adapters-manager/planetscale.ts +++ b/libs/driver-adapters/executor/src/driver-adapters-manager/planetscale.ts @@ -38,8 +38,7 @@ export class PlanetScaleManager implements DriverAdaptersManager { } async connect() { - this.#adapter = await this.#factory.connect() - return this.#adapter + return (this.#adapter ??= await this.#factory.connect()) } async teardown() {} diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/logs.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/logs.rs index 7abdb4976e24..48a2734309eb 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/logs.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/logs.rs @@ -8,7 +8,7 @@ use query_engine_tests::*; Postgres("neon.js.wasm", "pg.js.wasm"), Sqlite("libsql.js.wasm", "cfd1", "react-native", "better-sqlite3.js.wasm"), Sqlserver("mssql.js.wasm"), - Mysql("mariadb.js.wasm"), + Mysql("mariadb.js.wasm", "mariadb-mysql.js.wasm"), CockroachDb("pg.js.wasm") ) )] diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/metrics.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/metrics.rs index 830bb14f1876..901181da07e6 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/metrics.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/metrics.rs @@ -7,7 +7,7 @@ use query_engine_tests::test_suite; Postgres("neon.js.wasm", "pg.js.wasm"), Sqlite("libsql.js.wasm", "cfd1", "react-native", "better-sqlite3.js.wasm"), Sqlserver("mssql.js.wasm"), - Mysql("mariadb.js.wasm"), + Mysql("mariadb.js.wasm", "mariadb-mysql.js.wasm"), CockroachDb("pg.js.wasm"), ) )] diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/batch.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/batch.rs index dcb169227b45..beee179a0fef 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/batch.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/batch.rs @@ -68,7 +68,10 @@ mod relation_load_strategy_batch { compacted_query(runner).await } - #[connector_test(capabilities(CorrelatedSubqueries), exclude(Mysql("5.6", "5.7", "mariadb")))] + #[connector_test( + capabilities(CorrelatedSubqueries), + exclude(Mysql("5.6", "5.7", "mariadb", "mariadb.js.wasm")) + )] async fn compacted_query_subquery(runner: Runner) -> TestResult<()> { compacted_query(runner).await } @@ -104,7 +107,10 @@ mod relation_load_strategy_batch { compacted_join(runner).await } - #[connector_test(capabilities(CorrelatedSubqueries), exclude(Mysql("5.6", "5.7", "mariadb")))] + #[connector_test( + capabilities(CorrelatedSubqueries), + exclude(Mysql("5.6", "5.7", "mariadb", "mariadb.js.wasm")) + )] async fn compacted_join_subquery(runner: Runner) -> TestResult<()> { compacted_join(runner).await } @@ -140,7 +146,10 @@ mod relation_load_strategy_batch { mixed_rls_does_not_compact(runner).await } - #[connector_test(capabilities(CorrelatedSubqueries), exclude(Mysql("5.6", "5.7", "mariadb")))] + #[connector_test( + capabilities(CorrelatedSubqueries), + exclude(Mysql("5.6", "5.7", "mariadb", "mariadb.js.wasm")) + )] async fn mixed_rls_does_not_compact_subquery(runner: Runner) -> TestResult<()> { mixed_rls_does_not_compact(runner).await } diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/queries.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/queries.rs index 7807a761d39d..6455e65d24c7 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/queries.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/relation_load_strategy/queries.rs @@ -129,7 +129,7 @@ mod relation_load_strategy { $query, $result, capabilities(CorrelatedSubqueries), - exclude(Mysql("5.6", "5.7", "mariadb")) + exclude(Mysql("5.6", "5.7", "mariadb", "mariadb.js.wasm")) ); relation_load_strategy_test!( [<$name _lateral>], diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/chunking_qc.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/chunking_qc.rs index 9276aafdc5c9..6f179247b74f 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/chunking_qc.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/chunking_qc.rs @@ -5,7 +5,12 @@ use query_engine_tests::*; // Planetscale and MySQL via MariaDB driver consistently time out when running this test. #[test_suite( schema(schema), - exclude(MongoDb, Vitess("planetscale.js.wasm"), Mysql("mariadb.js.wasm")) + exclude( + MongoDb, + Vitess("planetscale.js.wasm"), + Mysql("mariadb.js.wasm"), + Mysql("mariadb-mysql.js.wasm") + ) )] mod chunking_qc { use indoc::indoc; diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json.rs index 7a7f4daf9cb8..d2e586bc1c39 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json.rs @@ -215,7 +215,7 @@ mod json { Vitess("planetscale.js.wasm"), Postgres("neon.js.wasm", "pg.js.wasm"), Sqlite("libsql.js.wasm", "cfd1", "better-sqlite3.js.wasm"), - MySQL(5.6, "mariadb.js.wasm"), + MySQL(5.6, "mariadb.js.wasm", "mariadb-mysql.js.wasm"), CockroachDb("pg.js.wasm"), ) )] diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json_filters.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json_filters.rs index 904a3fd7c633..c8462461ed12 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json_filters.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/json_filters.rs @@ -242,7 +242,7 @@ mod json_filters { match runner.connector_version() { // MariaDB does not support finding arrays in arrays, unlike MySQL - ConnectorVersion::MySql(Some(MySqlVersion::MariaDb)) => { + ConnectorVersion::MySql(Some(MySqlVersion::MariaDb | MySqlVersion::MariaDbJsWasm)) => { let res = run_query!(runner, jsonq(&runner, r#"array_contains: "[[1, 2]]" "#, None)); insta::allow_duplicates! { insta::assert_snapshot!( diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs index b81c04056559..9bd131bc967a 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs @@ -337,7 +337,7 @@ mod typed_output { Ok(()) } - #[connector_test(schema(schema_mysql), only(MySql("mariadb.js.wasm")))] + #[connector_test(schema(schema_mysql), only(MySql("mariadb.js.wasm", "mariadb-mysql.js.wasm")))] async fn all_scalars_mariadb_js(runner: Runner) -> TestResult<()> { create_row( &runner, diff --git a/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mod.rs b/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mod.rs index 355049bdfedb..d81f7278fd37 100644 --- a/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mod.rs +++ b/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mod.rs @@ -109,10 +109,10 @@ pub(crate) fn connection_string( ConnectorVersion::MySql(v) => match v { Some(MySqlVersion::V5_6) => format!("mysql://root:prisma@127.0.0.1:3309/{database}"), Some(MySqlVersion::V5_7) => format!("mysql://root:prisma@127.0.0.1:3306/{database}"), - Some(MySqlVersion::V8 | MySqlVersion::MariaDbJsWasm) => { + Some(MySqlVersion::V8 | MySqlVersion::MariaDbMysqlJsWasm) => { format!("mysql://root:prisma@127.0.0.1:3307/{database}") } - Some(MySqlVersion::MariaDb) => { + Some(MySqlVersion::MariaDb | MySqlVersion::MariaDbJsWasm) => { format!("mysql://root:prisma@127.0.0.1:3308/{database}") } @@ -285,6 +285,7 @@ impl ConnectorVersion { | Self::Sqlite(Some(SqliteVersion::BetterSQLite3)) | Self::SqlServer(Some(SqlServerVersion::MssqlJsWasm)) | Self::MySql(Some(MySqlVersion::MariaDbJsWasm)) + | Self::MySql(Some(MySqlVersion::MariaDbMysqlJsWasm)) | Self::CockroachDb(Some(CockroachDbVersion::PgJsWasm)) ) } diff --git a/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mysql.rs b/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mysql.rs index 472d3c259871..435291799d67 100644 --- a/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mysql.rs +++ b/query-engine/connector-test-kit-rs/query-tests-setup/src/connector_tag/mysql.rs @@ -35,6 +35,8 @@ pub enum MySqlVersion { V8, MariaDb, MariaDbJsWasm, + // Used for testing the MariaDB driver with a MySQL server. + MariaDbMysqlJsWasm, } impl TryFrom<&str> for MySqlVersion { @@ -47,6 +49,7 @@ impl TryFrom<&str> for MySqlVersion { "8" => Self::V8, "mariadb" => Self::MariaDb, "mariadb.js.wasm" => Self::MariaDbJsWasm, + "mariadb-mysql.js.wasm" => Self::MariaDbMysqlJsWasm, _ => return Err(TestError::parse_error(format!("Unknown MySQL version `{s}`"))), }; @@ -62,6 +65,7 @@ impl Display for MySqlVersion { MySqlVersion::V8 => f.write_str("8"), MySqlVersion::MariaDb => f.write_str("mariadb"), MySqlVersion::MariaDbJsWasm => f.write_str("mariadb.js.wasm"), + MySqlVersion::MariaDbMysqlJsWasm => f.write_str("mariadb-mysql.js.wasm"), } } } diff --git a/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-qc b/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-qc new file mode 100644 index 000000000000..fdd5945196f7 --- /dev/null +++ b/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-qc @@ -0,0 +1,6 @@ +{ + "connector": "mysql", + "version": "mariadb-mysql.js.wasm", + "driver_adapter": "mariadb", + "external_test_executor": "QueryCompiler" +} diff --git a/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-wasm b/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-wasm new file mode 100644 index 000000000000..51c5f7f597e8 --- /dev/null +++ b/query-engine/connector-test-kit-rs/test-configs/mariadb-mysql-wasm @@ -0,0 +1,6 @@ +{ + "connector": "mysql", + "version": "mariadb-mysql.js.wasm", + "driver_adapter": "mariadb", + "external_test_executor": "Wasm" +}