Browse Source

Fixed sql process in case of lambda with optional args (#7798)

Vitaly Stoyan 7 months ago
parent
commit
3fc1bbf7d3

+ 4 - 9
ydb/library/yql/core/type_ann/type_ann_core.cpp

@@ -8935,10 +8935,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
         TExprNode::TListType applyChildren = input->ChildrenList();
         applyChildren.pop_back(); // Remove position of list argument
 
-        if (input->Head().Type() != TExprNode::Lambda) {
-            if (!EnsureCallableType(input->Head(), ctx.Expr)) {
-                return IGraphTransformer::TStatus::Error;
-            }
+        if (input->Head().GetTypeAnn() && input->Head().GetTypeAnn()->GetKind() == ETypeAnnotationKind::Callable) {
             const TCallableExprType* callableType = input->Head().GetTypeAnn()->Cast<TCallableExprType>();
 
             if (applyChildren.size() < callableType->GetArgumentsSize() + 1 - callableType->GetOptionalArgumentsCount()) {
@@ -8992,11 +8989,9 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
         }
         else {
             auto lambda = input->HeadPtr();
-            const auto args = lambda->Child(0);
-            if (input->ChildrenSize() - 2 != args->ChildrenSize()) {
-                ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Different arguments count, lambda has "
-                    << args->ChildrenSize() << " arguments, but provided " << (input->ChildrenSize() - 2)));
-                return IGraphTransformer::TStatus::Error;
+            auto status = ConvertToLambda(lambda, ctx.Expr, input->ChildrenSize() - 2);
+            if (status == IGraphTransformer::TStatus::Error) {
+                return status;
             }
 
             output = ctx.Expr.Builder(input->Pos())

+ 22 - 0
ydb/library/yql/tests/sql/dq_file/part16/canondata/result.json

@@ -2367,6 +2367,28 @@
         }
     ],
     "test.test[pragma-config_exec--Results]": [],
+    "test.test[produce-process_lambda_opt_args-default.txt-Analyze]": [
+        {
+            "checksum": "db71f16db01fe45fcaff58e8f061b470",
+            "size": 6828,
+            "uri": "https://{canondata_backend}/1942100/d22a096de8f9cd6961c70a84e39de8dcd39ce45e/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Analyze_/plan.txt"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Debug]": [
+        {
+            "checksum": "901165ba1200caf03bc5f29c9348ad8d",
+            "size": 2061,
+            "uri": "https://{canondata_backend}/1942100/d22a096de8f9cd6961c70a84e39de8dcd39ce45e/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Debug_/opt.yql_patched"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Plan]": [
+        {
+            "checksum": "db71f16db01fe45fcaff58e8f061b470",
+            "size": 6828,
+            "uri": "https://{canondata_backend}/1942100/d22a096de8f9cd6961c70a84e39de8dcd39ce45e/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Plan_/plan.txt"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Results]": [],
     "test.test[produce-process_with_udf_validate-default.txt-Analyze]": [
         {
             "checksum": "be0f13fdf2aa4cfcc736815caa5d992e",

+ 14 - 0
ydb/library/yql/tests/sql/hybrid_file/part3/canondata/result.json

@@ -2603,6 +2603,20 @@
             "uri": "https://{canondata_backend}/1920236/56560fc4eb0991ee6681b0a1b288f62576ec0df7/resource.tar.gz#test.test_pg_duplicated-star_from_crossjoin-default.txt-Plan_/plan.txt"
         }
     ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Debug]": [
+        {
+            "checksum": "e2259aa77ae943bcfe8fc9caedb98d00",
+            "size": 2669,
+            "uri": "https://{canondata_backend}/1814674/0e62762049861bcf9f9d67d9b14ebdbaab665fa3/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Debug_/opt.yql_patched"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Plan]": [
+        {
+            "checksum": "a501aca13d0cdb216b2b1e3875ab929e",
+            "size": 8249,
+            "uri": "https://{canondata_backend}/1814674/0e62762049861bcf9f9d67d9b14ebdbaab665fa3/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Plan_/plan.txt"
+        }
+    ],
     "test.test[produce-process_with_udf_validate-default.txt-Debug]": [
         {
             "checksum": "d38c739bd48daee1bc9164fd494c78df",

+ 14 - 0
ydb/library/yql/tests/sql/sql2yql/canondata/result.json

@@ -15322,6 +15322,13 @@
             "uri": "https://{canondata_backend}/1784117/d56ae82ad9d30397a41490647be1bd2124718f98/resource.tar.gz#test_sql2yql.test_produce-process_and_filter_/sql.yql"
         }
     ],
+    "test_sql2yql.test[produce-process_lambda_opt_args]": [
+        {
+            "checksum": "4b75cc3c37fedf0e63bdd5e43ea06d68",
+            "size": 3814,
+            "uri": "https://{canondata_backend}/1936273/ff4f0a6d173adeb50438b8fd581dd8a952c141bd/resource.tar.gz#test_sql2yql.test_produce-process_lambda_opt_args_/sql.yql"
+        }
+    ],
     "test_sql2yql.test[produce-process_multi_in]": [
         {
             "checksum": "781a42dd763a6735bc4078a7a36e144f",
@@ -31639,6 +31646,13 @@
             "uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_produce-process_and_filter_/formatted.sql"
         }
     ],
+    "test_sql_format.test[produce-process_lambda_opt_args]": [
+        {
+            "checksum": "52fc6dc9253a2fe48d8ad637e655203b",
+            "size": 267,
+            "uri": "https://{canondata_backend}/1936273/ff4f0a6d173adeb50438b8fd581dd8a952c141bd/resource.tar.gz#test_sql_format.test_produce-process_lambda_opt_args_/formatted.sql"
+        }
+    ],
     "test_sql_format.test[produce-process_multi_in]": [
         {
             "checksum": "4a33f40cf13fca883c7f2662b5a83c1c",

+ 14 - 0
ydb/library/yql/tests/sql/suites/produce/process_lambda_opt_args.sql

@@ -0,0 +1,14 @@
+USE plato;
+
+$f = ($x, $optArg?)->{
+    return Ensure($x, $optArg is null or len($optArg)>0);
+};
+
+PROCESS Input0 USING $f(TableRow());
+
+PROCESS Input0 USING $f(TableRow(),'foo');
+
+PROCESS Input0 USING $f(TableRows());
+
+PROCESS Input0 USING $f(TableRows(),'foo');
+

+ 21 - 0
ydb/library/yql/tests/sql/yt_native_file/part16/canondata/result.json

@@ -2300,6 +2300,27 @@
             "uri": "https://{canondata_backend}/937458/4ef5c22fa3a7e5fd4e0ef2192cee531d67d22319/resource.tar.gz#test.test_pragma-release_temp_data_chain_pull--Results_/results.txt"
         }
     ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Debug]": [
+        {
+            "checksum": "e0f2a60056375db797d93f91152a4429",
+            "size": 2064,
+            "uri": "https://{canondata_backend}/1031349/58ce630c12e9fbb5d612967cd2d5c6e30429d817/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Debug_/opt.yql"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Plan]": [
+        {
+            "checksum": "9816950a9f9605af40ab6cfaad4af11f",
+            "size": 7680,
+            "uri": "https://{canondata_backend}/1031349/58ce630c12e9fbb5d612967cd2d5c6e30429d817/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Plan_/plan.txt"
+        }
+    ],
+    "test.test[produce-process_lambda_opt_args-default.txt-Results]": [
+        {
+            "checksum": "fe42b877468bdc4f554baebbe16b029e",
+            "size": 6730,
+            "uri": "https://{canondata_backend}/1031349/58ce630c12e9fbb5d612967cd2d5c6e30429d817/resource.tar.gz#test.test_produce-process_lambda_opt_args-default.txt-Results_/results.txt"
+        }
+    ],
     "test.test[produce-process_multi_in_single_out--Debug]": [
         {
             "checksum": "f565d7aff1e516d638a9f39059b6d9af",

+ 0 - 5
ydb/library/yql/tests/sql/yt_native_file/part7/canondata/test.test_match_recognize-without_order_by--Results_/extracted

@@ -1,5 +0,0 @@
-<tmp_path>/program.sql:<main>: Fatal: Optimization
-
-    <tmp_path>/program.sql:<main>:8:1: Fatal: ydb/library/yql/core/yql_opt_match_recognize.cpp:xxx  ExpandMatchRecognize(): requirement sortOrder->ChildrenSize() == 1 failed, message: Expect ORDER BY timestamp for MATCH_RECOGNIZE
-    	select * from (select * from AS_TABLE($data) MATCH_RECOGNIZE(
-	^