diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts index 037e5a4a1da91..805bec79b03e4 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts @@ -91,6 +91,22 @@ function createComparisonDefinition( ], returnType: 'boolean', }, + ...['date', 'number'].flatMap((type) => [ + { + params: [ + { name: 'left', type }, + { name: 'right', type: 'string', constantOnly: true }, + ], + returnType: 'boolean', + }, + { + params: [ + { name: 'right', type: 'string', constantOnly: true }, + { name: 'right', type }, + ], + returnType: 'boolean', + }, + ]), ...extraSignatures, ], }; @@ -99,14 +115,14 @@ function createComparisonDefinition( export const builtinFunctions: FunctionDefinition[] = [ createMathDefinition( '+', - ['number', 'date', ['date', 'time_literal'], ['time_literal', 'date']], + ['number', ['date', 'time_literal'], ['time_literal', 'date']], i18n.translate('kbn-esql-validation-autocomplete.esql.definition.addDoc', { defaultMessage: 'Add (+)', }) ), createMathDefinition( '-', - ['number', 'date', ['date', 'time_literal'], ['time_literal', 'date']], + ['number', ['date', 'time_literal'], ['time_literal', 'date']], i18n.translate('kbn-esql-validation-autocomplete.esql.definition.subtractDoc', { defaultMessage: 'Subtract (-)', }) diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 38f52da328688..55bc187813c5b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -2977,13 +2977,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" > 0", - "error": [ - "Argument of [>] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") > to_ip(\"127.0.0.1\")", "error": [], @@ -3002,6 +2995,26 @@ ], "warning": [] }, + { + "query": "row var = now() > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" > now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" > 42", + "error": [], + "warning": [] + }, { "query": "row var = 5 >= 0", "error": [], @@ -3024,13 +3037,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" >= 0", - "error": [ - "Argument of [>=] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") >= to_ip(\"127.0.0.1\")", "error": [], @@ -3049,6 +3055,26 @@ ], "warning": [] }, + { + "query": "row var = now() >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" >= now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" >= 42", + "error": [], + "warning": [] + }, { "query": "row var = 5 < 0", "error": [], @@ -3071,13 +3097,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" < 0", - "error": [ - "Argument of [<] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") < to_ip(\"127.0.0.1\")", "error": [], @@ -3096,6 +3115,26 @@ ], "warning": [] }, + { + "query": "row var = now() < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" < now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" < 42", + "error": [], + "warning": [] + }, { "query": "row var = 5 <= 0", "error": [], @@ -3118,13 +3157,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" <= 0", - "error": [ - "Argument of [<=] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") <= to_ip(\"127.0.0.1\")", "error": [], @@ -3143,6 +3175,26 @@ ], "warning": [] }, + { + "query": "row var = now() <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" <= now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" <= 42", + "error": [], + "warning": [] + }, { "query": "row var = 5 == 0", "error": [], @@ -3165,13 +3217,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" == 0", - "error": [ - "Argument of [==] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") == to_ip(\"127.0.0.1\")", "error": [], @@ -3187,6 +3232,26 @@ "error": [], "warning": [] }, + { + "query": "row var = now() == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" == now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" == 42", + "error": [], + "warning": [] + }, { "query": "row var = 5 != 0", "error": [], @@ -3209,13 +3274,6 @@ "error": [], "warning": [] }, - { - "query": "row var = \"a\" != 0", - "error": [ - "Argument of [!=] must be [number], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = to_ip(\"127.0.0.1\") != to_ip(\"127.0.0.1\")", "error": [], @@ -3231,6 +3289,26 @@ "error": [], "warning": [] }, + { + "query": "row var = now() != \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" != now()", + "error": [], + "warning": [] + }, + { + "query": "row var = 42 != \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"2022\" != 42", + "error": [], + "warning": [] + }, { "query": "row var = 1 + 1", "error": [], @@ -3243,7 +3321,9 @@ }, { "query": "row var = now() + now()", - "error": [], + "error": [ + "Argument of [+] must be [time_literal], found value [now()] type [date]" + ], "warning": [] }, { @@ -3258,7 +3338,9 @@ }, { "query": "row var = now() - now()", - "error": [], + "error": [ + "Argument of [-] must be [time_literal], found value [now()] type [date]" + ], "warning": [] }, { @@ -5322,13 +5404,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField > 0", - "error": [ - "Argument of [>] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField > stringField", "error": [], @@ -5357,6 +5432,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | where numberField > stringField", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField > numberField", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField > stringField", + "error": [ + "Argument of [>] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField > dateField", + "error": [ + "Argument of [>] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField > 0", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField > now()", + "error": [ + "Argument of [>] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | where numberField >= 0", "error": [], @@ -5382,13 +5509,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField >= 0", - "error": [ - "Argument of [>=] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField >= stringField", "error": [], @@ -5417,6 +5537,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | where numberField >= stringField", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField >= numberField", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField >= stringField", + "error": [ + "Argument of [>=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField >= dateField", + "error": [ + "Argument of [>=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField >= 0", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField >= now()", + "error": [ + "Argument of [>=] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | where numberField < 0", "error": [], @@ -5442,13 +5614,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField < 0", - "error": [ - "Argument of [<] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField < stringField", "error": [], @@ -5477,6 +5642,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | where numberField < stringField", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField < numberField", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField < stringField", + "error": [ + "Argument of [<] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField < dateField", + "error": [ + "Argument of [<] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField < 0", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField < now()", + "error": [ + "Argument of [<] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | where numberField <= 0", "error": [], @@ -5502,13 +5719,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField <= 0", - "error": [ - "Argument of [<=] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField <= stringField", "error": [], @@ -5537,6 +5747,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | where numberField <= stringField", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField <= numberField", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField <= stringField", + "error": [ + "Argument of [<=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField <= dateField", + "error": [ + "Argument of [<=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField <= 0", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField <= now()", + "error": [ + "Argument of [<=] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | where numberField == 0", "error": [], @@ -5562,13 +5824,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField == 0", - "error": [ - "Argument of [==] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField == stringField", "error": [], @@ -5594,6 +5849,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | where numberField == stringField", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField == numberField", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField == stringField", + "error": [ + "Argument of [==] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField == dateField", + "error": [ + "Argument of [==] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField == 0", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField == now()", + "error": [ + "Argument of [==] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | where numberField != 0", "error": [], @@ -5619,13 +5926,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | where stringField != 0", - "error": [ - "Argument of [!=] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | where stringField != stringField", "error": [], @@ -5647,8 +5947,60 @@ "warning": [] }, { - "query": "from a_index | where ipField != ipField", - "error": [], + "query": "from a_index | where ipField != ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField != stringField", + "error": [ + "Argument of [!=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField != numberField", + "error": [ + "Argument of [!=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField != \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField != stringField", + "error": [ + "Argument of [!=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField != dateField", + "error": [ + "Argument of [!=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | where dateField != \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField != 0", + "error": [ + "Argument of [!=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField != now()", + "error": [ + "Argument of [!=] must be [string], found value [now()] type [date]" + ], "warning": [] }, { @@ -11770,13 +12122,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval stringField > 0", - "error": [ - "Argument of [>] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | eval stringField > stringField", "error": [], @@ -11805,6 +12150,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval numberField > stringField", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField > numberField", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField > stringField", + "error": [ + "Argument of [>] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField > dateField", + "error": [ + "Argument of [>] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval dateField > \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField > 0", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField > now()", + "error": [ + "Argument of [>] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | eval numberField >= 0", "error": [], @@ -11830,13 +12227,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval stringField >= 0", - "error": [ - "Argument of [>=] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | eval stringField >= stringField", "error": [], @@ -11865,6 +12255,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval numberField >= stringField", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= numberField", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField >= stringField", + "error": [ + "Argument of [>=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= dateField", + "error": [ + "Argument of [>=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval dateField >= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= 0", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= now()", + "error": [ + "Argument of [>=] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | eval numberField < 0", "error": [], @@ -11890,13 +12332,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval stringField < 0", - "error": [ - "Argument of [<] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | eval stringField < stringField", "error": [], @@ -11925,6 +12360,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval numberField < stringField", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField < numberField", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField < stringField", + "error": [ + "Argument of [<] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField < dateField", + "error": [ + "Argument of [<] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval dateField < \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField < 0", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField < now()", + "error": [ + "Argument of [<] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | eval numberField <= 0", "error": [], @@ -11950,13 +12437,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval stringField <= 0", - "error": [ - "Argument of [<=] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | eval stringField <= stringField", "error": [], @@ -11985,6 +12465,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval numberField <= stringField", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= numberField", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField <= stringField", + "error": [ + "Argument of [<=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= dateField", + "error": [ + "Argument of [<=] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval dateField <= \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= 0", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= now()", + "error": [ + "Argument of [<=] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | eval numberField == 0", "error": [], @@ -12010,13 +12542,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval stringField == 0", - "error": [ - "Argument of [==] must be [number], found value [stringField] type [string]" - ], - "warning": [] - }, { "query": "from a_index | eval stringField == stringField", "error": [], @@ -12042,6 +12567,58 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval numberField == stringField", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField == numberField", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField == stringField", + "error": [ + "Argument of [==] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField == dateField", + "error": [ + "Argument of [==] must be [string], found value [dateField] type [date]" + ], + "warning": [] + }, + { + "query": "from a_index | eval dateField == \"2022\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField == 0", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField == now()", + "error": [ + "Argument of [==] must be [string], found value [now()] type [date]" + ], + "warning": [] + }, { "query": "from a_index | eval numberField + 1", "error": [], @@ -12059,7 +12636,9 @@ }, { "query": "from a_index | eval now() + now()", - "error": [], + "error": [ + "Argument of [+] must be [time_literal], found value [now()] type [date]" + ], "warning": [] }, { @@ -12079,7 +12658,9 @@ }, { "query": "from a_index | eval now() - now()", - "error": [], + "error": [ + "Argument of [-] must be [time_literal], found value [now()] type [date]" + ], "warning": [] }, { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 49283cdd7f210..770f1ce15e32f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -661,9 +661,6 @@ describe('validation logic', () => { testErrorsAndWarnings(`row var = NOT 5 ${op} 0`, []); testErrorsAndWarnings(`row var = (numberField ${op} 0)`, ['Unknown column [numberField]']); testErrorsAndWarnings(`row var = (NOT (5 ${op} 0))`, []); - testErrorsAndWarnings(`row var = "a" ${op} 0`, [ - `Argument of [${op}] must be [number], found value ["a"] type [string]`, - ]); testErrorsAndWarnings(`row var = to_ip("127.0.0.1") ${op} to_ip("127.0.0.1")`, []); testErrorsAndWarnings(`row var = now() ${op} now()`, []); testErrorsAndWarnings( @@ -675,6 +672,13 @@ describe('validation logic', () => { `Argument of [${op}] must be [number], found value [false] type [boolean]`, ] ); + for (const [valueTypeA, valueTypeB] of [ + ['now()', '"2022"'], + ['42', '"2022"'], + ]) { + testErrorsAndWarnings(`row var = ${valueTypeA} ${op} ${valueTypeB}`, []); + testErrorsAndWarnings(`row var = ${valueTypeB} ${op} ${valueTypeA}`, []); + } } for (const op of ['+', '-', '*', '/', '%']) { testErrorsAndWarnings(`row var = 1 ${op} 1`, []); @@ -682,7 +686,7 @@ describe('validation logic', () => { testErrorsAndWarnings( `row var = now() ${op} now()`, ['+', '-'].includes(op) - ? [] + ? [`Argument of [${op}] must be [time_literal], found value [now()] type [date]`] : [ `Argument of [${op}] must be [number], found value [now()] type [date]`, `Argument of [${op}] must be [number], found value [now()] type [date]`, @@ -1090,9 +1094,7 @@ describe('validation logic', () => { testErrorsAndWarnings(`from a_index | where (numberField ${op} 0)`, []); testErrorsAndWarnings(`from a_index | where (NOT (numberField ${op} 0))`, []); testErrorsAndWarnings(`from a_index | where 1 ${op} 0`, []); - testErrorsAndWarnings(`from a_index | where stringField ${op} 0`, [ - `Argument of [${op}] must be [number], found value [stringField] type [string]`, - ]); + for (const type of ['string', 'number', 'date', 'boolean', 'ip']) { testErrorsAndWarnings( `from a_index | where ${type}Field ${op} ${type}Field`, @@ -1104,6 +1106,31 @@ describe('validation logic', () => { ] ); } + + // Implicit casting of literal values tests + testErrorsAndWarnings(`from a_index | where numberField ${op} stringField`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | where stringField ${op} numberField`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | where numberField ${op} "2022"`, []); + + testErrorsAndWarnings(`from a_index | where dateField ${op} stringField`, [ + `Argument of [${op}] must be [string], found value [dateField] type [date]`, + ]); + testErrorsAndWarnings(`from a_index | where stringField ${op} dateField`, [ + `Argument of [${op}] must be [string], found value [dateField] type [date]`, + ]); + testErrorsAndWarnings(`from a_index | where dateField ${op} "2022"`, []); + + // Check that the implicit cast doesn't apply for fields + testErrorsAndWarnings(`from a_index | where stringField ${op} 0`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | where stringField ${op} now()`, [ + `Argument of [${op}] must be [string], found value [now()] type [date]`, + ]); } for (const nesting of NESTED_DEPTHS) { @@ -1671,9 +1698,6 @@ describe('validation logic', () => { testErrorsAndWarnings(`from a_index | eval (numberField ${op} 0)`, []); testErrorsAndWarnings(`from a_index | eval (NOT (numberField ${op} 0))`, []); testErrorsAndWarnings(`from a_index | eval 1 ${op} 0`, []); - testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ - `Argument of [${op}] must be [number], found value [stringField] type [string]`, - ]); for (const type of ['string', 'number', 'date', 'boolean', 'ip']) { testErrorsAndWarnings( `from a_index | eval ${type}Field ${op} ${type}Field`, @@ -1685,6 +1709,30 @@ describe('validation logic', () => { ] ); } + // Implicit casting of literal values tests + testErrorsAndWarnings(`from a_index | eval numberField ${op} stringField`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | eval stringField ${op} numberField`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | eval numberField ${op} "2022"`, []); + + testErrorsAndWarnings(`from a_index | eval dateField ${op} stringField`, [ + `Argument of [${op}] must be [string], found value [dateField] type [date]`, + ]); + testErrorsAndWarnings(`from a_index | eval stringField ${op} dateField`, [ + `Argument of [${op}] must be [string], found value [dateField] type [date]`, + ]); + testErrorsAndWarnings(`from a_index | eval dateField ${op} "2022"`, []); + + // Check that the implicit cast doesn't apply for fields + testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + testErrorsAndWarnings(`from a_index | eval stringField ${op} now()`, [ + `Argument of [${op}] must be [string], found value [now()] type [date]`, + ]); } for (const op of ['+', '-', '*', '/', '%']) { testErrorsAndWarnings(`from a_index | eval numberField ${op} 1`, []); @@ -1693,7 +1741,7 @@ describe('validation logic', () => { testErrorsAndWarnings( `from a_index | eval now() ${op} now()`, ['+', '-'].includes(op) - ? [] + ? [`Argument of [${op}] must be [time_literal], found value [now()] type [date]`] : [ `Argument of [${op}] must be [number], found value [now()] type [date]`, `Argument of [${op}] must be [number], found value [now()] type [date]`,