From e37353fa545a49ccbb49aa3621cca0672c06ab60 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Thu, 12 Feb 2026 15:42:30 +0100 Subject: [PATCH 1/2] HCK-14813: fix unexpected semicolon --- forward_engineering/helpers/tableHelper.js | 4 +++- forward_engineering/utils/general.js | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index 4718a44d..01e40b5a 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -12,6 +12,7 @@ const { getDBVersionNumber, generateFullEntityName, executeUnlessStreaming, + cleanQuery, } = require('../utils/general'); const { getColumnsStatement, getColumns } = require('./columnHelper'); const keyHelper = require('./keyHelper'); @@ -800,7 +801,8 @@ const getCreateStreamingStatement = ({ const rowFilterClause = getRowFilterClause(rowFilterGroup, entityJsonProperties); - const queryClause = selectStreamingStatement ? `AS ${selectStreamingStatement}` : ''; + const cleanedStatement = cleanQuery(selectStreamingStatement); + const queryClause = cleanedStatement ? `AS ${cleanedStatement}` : ''; return buildStatement(`${createPrefix}${isNotExistsStatement} ${fullTableName} (`, isActivated)( tableStructure, diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 8aed7178..0ea4e99f 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -328,6 +328,19 @@ const executeUnlessStreaming = (isStreaming, task, fallback = '') => { return task(); }; +/** + * Prepares the raw SQL query for embedding in the final DDL statement. + * It removes leading/trailing whitespace and strips any trailing semicolons + * to prevent syntax errors when the query is used inside a subquery or CTAS statement. + * + * @param {string} query - The raw SQL query string from the user input. + * @returns {string} The cleaned query string without trailing semicolons. + */ +const cleanQuery = query => { + if (!query) return ''; + return query.trim().replace(/;+$/, ''); +}; + module.exports = { buildStatement, getName, @@ -364,4 +377,5 @@ module.exports = { checkLiquidClusteringPropertyChanged, generateFullEntityNameFromBucketAndTableNames, executeUnlessStreaming, + cleanQuery, }; From e79add4f583382b23385301b0be897fbdc4d6455 Mon Sep 17 00:00:00 2001 From: ivan-m-dev Date: Thu, 12 Feb 2026 15:59:58 +0100 Subject: [PATCH 2/2] HCK-14813: SonarQube fix --- forward_engineering/utils/general.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 0ea4e99f..fd7ef16c 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -331,14 +331,21 @@ const executeUnlessStreaming = (isStreaming, task, fallback = '') => { /** * Prepares the raw SQL query for embedding in the final DDL statement. * It removes leading/trailing whitespace and strips any trailing semicolons - * to prevent syntax errors when the query is used inside a subquery or CTAS statement. + * to prevent syntax errors. * * @param {string} query - The raw SQL query string from the user input. * @returns {string} The cleaned query string without trailing semicolons. */ const cleanQuery = query => { - if (!query) return ''; - return query.trim().replace(/;+$/, ''); + const cleaned = query?.trim(); + if (!cleaned) return ''; + + let finalQuery = cleaned; + while (finalQuery.endsWith(';')) { + finalQuery = finalQuery.slice(0, -1); + } + + return finalQuery; }; module.exports = {