From 10fb28c6ea52be948a0e14b58eb12e26b6137c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Tue, 30 Apr 2024 13:36:20 +0200 Subject: [PATCH] Fix crash with untuple and unresolved lambda --- src/Analyzer/Passes/QueryAnalysisPass.cpp | 4 ++++ tests/queries/0_stateless/03142_untuple_crash.reference | 0 tests/queries/0_stateless/03142_untuple_crash.sql | 1 + 3 files changed, 5 insertions(+) create mode 100644 tests/queries/0_stateless/03142_untuple_crash.reference create mode 100644 tests/queries/0_stateless/03142_untuple_crash.sql diff --git a/src/Analyzer/Passes/QueryAnalysisPass.cpp b/src/Analyzer/Passes/QueryAnalysisPass.cpp index 73d1b9df5f6..04b2c6de19e 100644 --- a/src/Analyzer/Passes/QueryAnalysisPass.cpp +++ b/src/Analyzer/Passes/QueryAnalysisPass.cpp @@ -5725,6 +5725,10 @@ ProjectionNames QueryAnalyzer::resolveFunction(QueryTreeNodePtr & node, Identifi checkFunctionNodeHasEmptyNullsAction(function_node); const auto & untuple_argument = function_arguments[0]; + /// Handle this special case first as `getResultType()` might return nullptr + if (untuple_argument->as()) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Function untuple can't have lambda-expressions as arguments"); + auto result_type = untuple_argument->getResultType(); const auto * tuple_data_type = typeid_cast(result_type.get()); if (!tuple_data_type) diff --git a/tests/queries/0_stateless/03142_untuple_crash.reference b/tests/queries/0_stateless/03142_untuple_crash.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/03142_untuple_crash.sql b/tests/queries/0_stateless/03142_untuple_crash.sql new file mode 100644 index 00000000000..e0f4225dbac --- /dev/null +++ b/tests/queries/0_stateless/03142_untuple_crash.sql @@ -0,0 +1 @@ +SELECT untuple(x -> 0) -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }