diff --git a/frontend/src/metabase/lib/expressions/config.js b/frontend/src/metabase/lib/expressions/config.js index 66f40ae822175ba966a2025c1addfb5c8033e241..590e509d1d2c8d7e46e274e36bec10031327af9e 100644 --- a/frontend/src/metabase/lib/expressions/config.js +++ b/frontend/src/metabase/lib/expressions/config.js @@ -363,12 +363,12 @@ export const MBQL_CLAUSES = { }, "date-add": { displayName: `dateAdd`, - type: "number", + type: "expression", args: ["expression", "number", "string"], }, "date-subtract": { displayName: `dateSubtract`, - type: "number", + type: "expression", args: ["expression", "number", "string"], }, }; diff --git a/frontend/src/metabase/lib/expressions/typeinferencer.js b/frontend/src/metabase/lib/expressions/typeinferencer.js index 85b359e7bcb6ea67890676c9ad092ca7102e2923..3dc1d5c1fdc06266b06fde78e0bd9305cd472927 100644 --- a/frontend/src/metabase/lib/expressions/typeinferencer.js +++ b/frontend/src/metabase/lib/expressions/typeinferencer.js @@ -12,6 +12,7 @@ export function infer(mbql, env) { if (!Array.isArray(mbql)) { return typeof mbql; } + const op = mbql[0]; switch (op) { case OP.Plus: @@ -32,16 +33,13 @@ export function infer(mbql, env) { return MONOTYPE.Boolean; } - if (op === "case") { - const clauses = mbql[1]; - const first = clauses[0]; - // TODO: type-checker must ensure the consistent types of all clauses. - return infer(first[1], env); - } - - if (op === "coalesce") { - // TODO: type-checker must ensure the consistent types of all arguments - return infer(mbql[1], env); + switch (op) { + case "case": + return infer(mbql[1][0][1], env); + case "coalesce": + case "date-add": + case "date-subtract": + return infer(mbql[1], env); } const func = MBQL_CLAUSES[op];