diff --git a/packages/nocodb-sdk/src/lib/formulaHelpers.spec.ts b/packages/nocodb-sdk/src/lib/formulaHelpers.spec.ts index 968b8b7d31..da6c0e7294 100644 --- a/packages/nocodb-sdk/src/lib/formulaHelpers.spec.ts +++ b/packages/nocodb-sdk/src/lib/formulaHelpers.spec.ts @@ -10,7 +10,7 @@ describe('Formula parsing and type validation', () => { formula: '1 + 2', columns: [], clientOrSqlUi: 'mysql2', - getMeta: async () => ({}) + getMeta: async () => ({}), }); expect(result.dataType).toEqual(FormulaDataTypes.NUMERIC); @@ -27,7 +27,7 @@ describe('Formula parsing and type validation', () => { }, ], clientOrSqlUi: 'mysql2', - getMeta: async () => ({}) + getMeta: async () => ({}), }); expect(result.dataType).toEqual(FormulaDataTypes.STRING); @@ -49,7 +49,7 @@ describe('Formula parsing and type validation', () => { }, ], clientOrSqlUi: 'mysql2', - getMeta: async () => ({}) + getMeta: async () => ({}), }); expect(result.dataType).toEqual(FormulaDataTypes.STRING); @@ -69,7 +69,7 @@ describe('Formula parsing and type validation', () => { }, ], clientOrSqlUi: 'mysql2', - getMeta: async () => ({}) + getMeta: async () => ({}), }); expect(result1.dataType).toEqual(FormulaDataTypes.NUMERIC); diff --git a/packages/nocodb-sdk/src/lib/formulaHelpers.ts b/packages/nocodb-sdk/src/lib/formulaHelpers.ts index 182cd0b6e8..155df4ae02 100644 --- a/packages/nocodb-sdk/src/lib/formulaHelpers.ts +++ b/packages/nocodb-sdk/src/lib/formulaHelpers.ts @@ -1400,6 +1400,7 @@ async function extractColumnIdentifierType({ export async function validateFormulaAndExtractTreeWithType({ formula, + column, columns, clientOrSqlUi, getMeta, @@ -1420,6 +1421,7 @@ export async function validateFormulaAndExtractTreeWithType({ | typeof MssqlUi | typeof SnowflakeUi | typeof PgUi; + column?: ColumnType; getMeta: (tableId: string) => Promise; }) { const colAliasToColMap = {}; @@ -1582,9 +1584,9 @@ export async function validateFormulaAndExtractTreeWithType({ res.name = col.id; - if (col?.uidt === UITypes.Formula) { + if (col?.uidt === UITypes.Formula && column) { // check for circular reference - checkForCircularFormulaRef(col, parsedTree, columns); + checkForCircularFormulaRef(column, parsedTree, columns); const formulaRes = col.colOptions?.parsed_tree || diff --git a/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts b/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts index f0a33767ef..d1399b425c 100644 --- a/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts +++ b/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts @@ -80,6 +80,7 @@ async function _formulaQueryBuilder( tree = await validateFormulaAndExtractTreeWithType({ formula: _tree.replaceAll('{{', '{').replaceAll('}}', '}'), columns, + column, clientOrSqlUi: baseModelSqlv2.clientType as | 'mysql' | 'pg' diff --git a/packages/nocodb/src/services/columns.service.ts b/packages/nocodb/src/services/columns.service.ts index e16e195b5a..aa9236779e 100644 --- a/packages/nocodb/src/services/columns.service.ts +++ b/packages/nocodb/src/services/columns.service.ts @@ -213,6 +213,7 @@ export class ColumnsService { colBody.parsed_tree = await validateFormulaAndExtractTreeWithType({ formula: colBody.formula_raw || colBody.formula, columns: table.columns, + column, clientOrSqlUi: source.type, getMeta: async (modelId) => { const model = await Model.get(modelId); @@ -947,6 +948,7 @@ export class ColumnsService { parsed_tree: await validateFormulaAndExtractTreeWithType({ formula: new_formula_raw, columns: table.columns, + column, clientOrSqlUi: source.type, getMeta: async (modelId) => { const model = await Model.get(modelId); @@ -1018,6 +1020,7 @@ export class ColumnsService { parsed_tree: await validateFormulaAndExtractTreeWithType({ formula: new_formula_raw, columns: table.columns, + column, clientOrSqlUi: source.type, getMeta: async (modelId) => { const model = await Model.get(modelId); @@ -1236,6 +1239,10 @@ export class ColumnsService { formula: colBody.formula_raw || colBody.formula?.replaceAll('{{', '{').replaceAll('}}', '}'), + column:{ + ...colBody, + colOptions: colBody, + }, columns: table.columns, clientOrSqlUi: source.type, getMeta: async (modelId) => {