From 0c22a415d23f4c7b5cc36e602e7cf13d4498b2e2 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Wed, 13 Dec 2023 09:35:59 +0100 Subject: [PATCH] Use sql.unnest for inserting large set or rows (#3595) --- packages/libraries/client/src/version.ts | 2 +- packages/services/storage/src/index.ts | 56 ++++++++++++------------ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/packages/libraries/client/src/version.ts b/packages/libraries/client/src/version.ts index a19268926..8ba60d695 100644 --- a/packages/libraries/client/src/version.ts +++ b/packages/libraries/client/src/version.ts @@ -1 +1 @@ -export const version = '0.26.0'; +export const version = '0.27.0'; diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index 78f4d16f7..7cf6de129 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -3855,23 +3855,20 @@ export async function createStorage(connection: string, maximumPoolSize: number) , "schema_change_id" , "schema_change" ) - VALUES ${sql.join( - schemaCheck.breakingSchemaChanges.map( - change => - sql`( - ${schemaCheck.targetId} - , ${schemaCheck.contextId} - , ${change.id} - , ${sql.jsonb( - toSerializableSchemaChange({ - ...change, - // We enhance the approved schema changes with some metadata that can be displayed on the UI - approvalMetadata, - }), - )} - )`, - ), - sql`,`, + SELECT * FROM ${sql.unnest( + schemaCheck.breakingSchemaChanges.map(change => [ + schemaCheck.targetId, + schemaCheck.contextId ?? null, + change.id, + JSON.stringify( + toSerializableSchemaChange({ + ...change, + // We enhance the approved schema changes with some metadata that can be displayed on the UI + approvalMetadata, + }), + ), + ]), + ['uuid', 'text', 'text', 'jsonb'], )} ON CONFLICT ("target_id", "context_id", "schema_change_id") DO NOTHING `); @@ -4447,19 +4444,20 @@ async function insertSchemaVersionChanges( "severity_level", "meta", "is_safe_based_on_usage" - ) VALUES ${sql.join( - args.changes.map( - change => - // Note: change.criticality.level is actually a computed value from meta - sql`( - ${args.versionId}, - ${change.type}, - ${change.criticality}, - ${JSON.stringify(change.meta)}::jsonb, - ${change.isSafeBasedOnUsage ?? false} - )`, + ) + SELECT * FROM + ${sql.unnest( + args.changes.map(change => + // Note: change.criticality.level is actually a computed value from meta + [ + args.versionId, + change.type, + change.criticality, + JSON.stringify(change.meta), + change.isSafeBasedOnUsage ?? false, + ], ), - sql`\n,`, + ['uuid', 'text', 'text', 'jsonb', 'bool'], )} `); }