From 15d116f6d0ba00c040a22ec47a3b963715465691 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Wed, 3 Jun 2026 12:29:42 +0200 Subject: [PATCH 1/4] HCK-16374: add unquoted default IAM ROLE --- forward_engineering/configs/templates.js | 2 +- forward_engineering/ddlProvider.js | 11 +++++++++-- forward_engineering/helpers/tableHelper.js | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/forward_engineering/configs/templates.js b/forward_engineering/configs/templates.js index 3a56d71..062efea 100644 --- a/forward_engineering/configs/templates.js +++ b/forward_engineering/configs/templates.js @@ -2,7 +2,7 @@ module.exports = { createDatabase: '', createSchema: 'CREATE SCHEMA${ifNotExist} "${name}"${authorization}${quota};\n', createExternalSchema: - "CREATE EXTERNAL SCHEMA${ifNotExist} \"${name}\" FROM ${source}\nDATABASE '${sourceDBName}'${sourceSchemaName}${region}${uri}\nIAM_ROLE '${iamRole}'${secretARN}${catalogRole}${createExternalDatabase};\n", + 'CREATE EXTERNAL SCHEMA${ifNotExist} "${name}" FROM ${source}\nDATABASE \'${sourceDBName}\'${sourceSchemaName}${region}${uri}\nIAM_ROLE ${iamRole}${secretARN}${catalogRole}${createExternalDatabase};\n', createTable: 'CREATE ${temporary}TABLE' + diff --git a/forward_engineering/ddlProvider.js b/forward_engineering/ddlProvider.js index 6414088..8fbc2ee 100644 --- a/forward_engineering/ddlProvider.js +++ b/forward_engineering/ddlProvider.js @@ -4,7 +4,12 @@ const defaultTypes = require('./configs/defaultTypes'); const templates = require('./configs/templates'); const types = require('./configs/types'); const { commentIfDeactivated } = require('./helpers/commentDeactivatedHelper'); -const { getTableAttributes, getTableConstraints, getTableLikeConstraint } = require('./helpers/tableHelper'); +const { + getTableAttributes, + getTableConstraints, + getTableLikeConstraint, + formatIamRole, +} = require('./helpers/tableHelper'); module.exports = (baseProvider, options, app) => { const { hasType } = app.require('@hackolade/ddl-fe-utils').general; @@ -109,6 +114,8 @@ module.exports = (baseProvider, options, app) => { comment: toString(comment), }); if (external) { + const iamRoleFormatted = formatIamRole(iamRole); + database = assignTemplates(templates.createExternalSchema, { name, ifNotExist, @@ -117,7 +124,7 @@ module.exports = (baseProvider, options, app) => { sourceSchemaName, region, uri, - iamRole, + iamRole: iamRoleFormatted, secretARN, catalogRole, createExternalDatabase, diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index ba84901..3fe1dbc 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -50,8 +50,22 @@ const getTableLikeConstraint = (likeTableName, includingDefault, needComma) => { return likeStatement; }; +const formatIamRole = iamRole => { + if (!iamRole) { + return "''"; + } + + const normalizedRole = String(iamRole).trim(); + if (normalizedRole.toLowerCase() === 'default') { + return 'default'; + } + + return `'${normalizedRole}'`; +}; + module.exports = { getTableAttributes, getTableConstraints, getTableLikeConstraint, + formatIamRole, }; From 955d6a0bd38cdad36e82a7e2871dc70618942156 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Wed, 3 Jun 2026 17:10:45 +0200 Subject: [PATCH 2/4] HCK-16376: add clean properties helper --- forward_engineering/helpers/general.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index f8d43c6..1da3da0 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -188,18 +188,28 @@ module.exports = app => { .join(', ') : ''; + const stripQuotes = str => { + if (!str) return ''; + + return str.trim().replaceAll(/^['"]+|['"]+$/g, ''); + }; + const parseProps = text => { if (!text) return ''; return text .split('\n') .map(line => line.trim()) + .map(line => line.replace(/,$/, '').trim()) .filter(line => line.includes('=')) .map(line => { const [propertyKey, ...valueParts] = line.split('='); const propertyValue = valueParts.join('=').trim(); - return `'${escape(propertyKey.trim())}'='${escape(propertyValue)}'`; + const cleanKey = stripQuotes(propertyKey); + const cleanValue = stripQuotes(propertyValue); + + return `'${escape(cleanKey)}'='${escape(cleanValue)}'`; }) .join(', '); }; @@ -210,7 +220,10 @@ module.exports = app => { } if (tableData.rowFormatType === ROW_FORMAT_TYPES.SERDE && tableData.rowFormatSerde) { - let format = `\nROW FORMAT SERDE ${toString(tableData.rowFormatSerde)}`; + const cleanSerdeClass = stripQuotes(tableData.rowFormatSerde); + + let format = `\nROW FORMAT SERDE ${toString(cleanSerdeClass)}`; + const serdeProps = parseProps(tableData.serdeProperties); if (serdeProps) { From e0dd7da7b128785d18772a15530acc9b5e98c6d5 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Wed, 3 Jun 2026 17:21:57 +0200 Subject: [PATCH 3/4] HCK-16376: update RegExp, SonarCloud --- forward_engineering/helpers/general.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index 1da3da0..fa8dfda 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -191,7 +191,10 @@ module.exports = app => { const stripQuotes = str => { if (!str) return ''; - return str.trim().replaceAll(/^['"]+|['"]+$/g, ''); + return str + .trim() + .replace(/^['"]+/, '') + .replace(/['"]+$/, ''); }; const parseProps = text => { From c8bf861ec7452e59a91fcce96e88b804e5190d73 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Wed, 3 Jun 2026 17:32:35 +0200 Subject: [PATCH 4/4] HCK-16376: update stripQuotes, SonarCloud --- forward_engineering/helpers/general.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index fa8dfda..5195899 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -188,13 +188,15 @@ module.exports = app => { .join(', ') : ''; - const stripQuotes = str => { - if (!str) return ''; + const stripQuotes = value => { + if (!value) return ''; + let string = value.trim(); - return str - .trim() - .replace(/^['"]+/, '') - .replace(/['"]+$/, ''); + while (/^['"]|['"]$/.test(string)) { + string = string.replaceAll(/^['"]|['"]$/g, ''); + } + + return string; }; const parseProps = text => {