From 156f420c3bd4e16df212f35641ee911efb93b92a Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 29 Dec 2023 12:47:52 +0530 Subject: [PATCH] fix: type validation corrections RIGHT, LEFT and MID --- packages/nocodb-sdk/src/lib/formulaHelpers.ts | 79 +++++++++++++++++-- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/packages/nocodb-sdk/src/lib/formulaHelpers.ts b/packages/nocodb-sdk/src/lib/formulaHelpers.ts index d6e91ee7ff..6b9450e0d8 100644 --- a/packages/nocodb-sdk/src/lib/formulaHelpers.ts +++ b/packages/nocodb-sdk/src/lib/formulaHelpers.ts @@ -321,7 +321,6 @@ export const formulas: Record = { validation: { args: { rqd: 3, - type: FormulaDataTypes.DATE, }, custom: (_argTypes: FormulaDataTypes[], parsedTree: any) => { if (parsedTree.arguments[0].type === JSEPNode.LITERAL) { @@ -377,6 +376,7 @@ export const formulas: Record = { validation: { args: { rqd: 1, + type: FormulaDataTypes.DATE, }, }, syntax: 'DATESTR(date | datetime)', @@ -388,6 +388,7 @@ export const formulas: Record = { validation: { args: { rqd: 1, + type: FormulaDataTypes.DATE, }, }, syntax: 'DAY(date | datetime)', @@ -399,6 +400,7 @@ export const formulas: Record = { validation: { args: { rqd: 1, + type: FormulaDataTypes.DATE, }, }, syntax: 'MONTH(date | datetime)', @@ -410,6 +412,7 @@ export const formulas: Record = { validation: { args: { rqd: 1, + type: FormulaDataTypes.DATE, }, }, syntax: 'DAY(time | datetime)', @@ -425,7 +428,6 @@ export const formulas: Record = { args: { min: 2, max: 3, - type: FormulaDataTypes.DATE, }, custom: (_argTypes: FormulaDataTypes[], parsedTree: any) => { if (parsedTree.arguments[0].type === JSEPNode.LITERAL) { @@ -814,7 +816,6 @@ export const formulas: Record = { validation: { args: { rqd: 0, - type: FormulaDataTypes.DATE, }, }, description: 'Retrieve the current time and day.', @@ -882,8 +883,29 @@ export const formulas: Record = { validation: { args: { rqd: 2, - type: FormulaDataTypes.STRING, }, + custom(argTypes: FormulaDataTypes[], parsedTree) { + if (argTypes[0] !== FormulaDataTypes.STRING) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.stringTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'String type is expected' + ); + } + if (argTypes[1] !== FormulaDataTypes.NUMERIC) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.numericTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'Numeric type is expected' + ); + } + } }, description: 'Retrieve the last n characters from the input string.', syntax: 'RIGHT(str, n)', @@ -897,8 +919,29 @@ export const formulas: Record = { validation: { args: { rqd: 2, - type: FormulaDataTypes.STRING, }, + custom(argTypes: FormulaDataTypes[], parsedTree) { + if (argTypes[0] !== FormulaDataTypes.STRING) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.stringTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'String type is expected' + ); + } + if (argTypes[1] !== FormulaDataTypes.NUMERIC) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.numericTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'Numeric type is expected' + ); + } + } }, description: 'Retrieve the first n characters from the input string.', syntax: 'LEFT(str, n)', @@ -964,8 +1007,31 @@ export const formulas: Record = { validation: { args: { rqd: 3, - type: FormulaDataTypes.STRING, }, + custom(argTypes: FormulaDataTypes[], parsedTree) { + if (argTypes[0] !== FormulaDataTypes.STRING) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.stringTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'String type is expected' + ); + } + for(const i in [1,2]) { + if (argTypes[i] !== FormulaDataTypes.NUMERIC) { + throw new FormulaError( + FormulaErrorType.INVALID_ARG, + { + key: 'msg.formula.numericTypeIsExpected', + calleeName: parsedTree.callee?.name?.toUpperCase(), + }, + 'Numeric type is expected' + ); + } + } + } }, description: 'Extracts a substring; an alias for SUBSTR.', syntax: 'MID(str, position, [count])', @@ -1083,7 +1149,6 @@ export const formulas: Record = { args: { min: 1, max: 2, - type: FormulaDataTypes.NUMERIC, }, custom(_argTypes: FormulaDataTypes[], parsedTree: any) { if (parsedTree.arguments[0].type === JSEPNode.LITERAL) {