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/general.js b/forward_engineering/helpers/general.js index f8d43c6..5195899 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -188,18 +188,33 @@ module.exports = app => { .join(', ') : ''; + const stripQuotes = value => { + if (!value) return ''; + let string = value.trim(); + + while (/^['"]|['"]$/.test(string)) { + string = string.replaceAll(/^['"]|['"]$/g, ''); + } + + return string; + }; + 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 +225,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) { 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, };