diff options
author | sinister <sinister@yandex-team.ru> | 2022-02-10 16:50:50 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:50:50 +0300 |
commit | b76c7a19e20d232ef1e00ccbe68f64a3024d29ed (patch) | |
tree | f8eeda3ddf7f474d0defce552e5eb141e5943509 | |
parent | fd57eb4948385b403f53b2f711399e516d46dcac (diff) | |
download | ydb-b76c7a19e20d232ef1e00ccbe68f64a3024d29ed.tar.gz |
Restoring authorship annotation for <sinister@yandex-team.ru>. Commit 1 of 2.
-rw-r--r-- | build/plugins/yql_python_udf.py | 24 | ||||
-rw-r--r-- | build/scripts/gen_yql_python_udf.py | 50 | ||||
-rw-r--r-- | library/cpp/yson_pull/detail/lexer_base.h | 52 | ||||
-rw-r--r-- | library/cpp/yson_pull/detail/percent_scalar.h | 62 | ||||
-rw-r--r-- | library/cpp/yson_pull/detail/reader.h | 26 | ||||
-rw-r--r-- | library/cpp/yson_pull/detail/writer.h | 32 | ||||
-rw-r--r-- | library/cpp/yson_pull/ut/reader_ut.cpp | 58 | ||||
-rw-r--r-- | library/cpp/yson_pull/ut/writer_ut.cpp | 22 | ||||
-rw-r--r-- | ydb/library/yql/core/expr_nodes/yql_expr_nodes.json | 10 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/builtin.cpp | 156 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/query.cpp | 16 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 30 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 140 |
13 files changed, 339 insertions, 339 deletions
diff --git a/build/plugins/yql_python_udf.py b/build/plugins/yql_python_udf.py index c4f949d8a9..324821c3bf 100644 --- a/build/plugins/yql_python_udf.py +++ b/build/plugins/yql_python_udf.py @@ -8,11 +8,11 @@ def get_or_default(kv, name, default): def onregister_yql_python_udf(unit, *args): - flat, kv = sort_by_keywords({'NAME': 1, 'RESOURCE_NAME': 1, 'ADD_LIBRA_MODULES': 1}, args) + flat, kv = sort_by_keywords({'NAME': 1, 'RESOURCE_NAME': 1, 'ADD_LIBRA_MODULES': 1}, args) assert len(flat) == 0 name = get_or_default(kv, 'NAME', 'CustomPython') resource_name = get_or_default(kv, 'RESOURCE_NAME', name) - add_libra_modules = get_or_default(kv, 'ADD_LIBRA_MODULES', 'no') == 'yes' + add_libra_modules = get_or_default(kv, 'ADD_LIBRA_MODULES', 'no') == 'yes' use_arcadia_python = unit.get('USE_ARCADIA_PYTHON') == 'yes' py3 = unit.get('PYTHON3') == 'yes' @@ -21,10 +21,10 @@ def onregister_yql_python_udf(unit, *args): unit.onpeerdir(['yql/udfs/common/python/python_udf']) unit.onpeerdir(['ydb/library/yql/public/udf']) - if add_libra_modules: - unit.onpeerdir(['quality/user_sessions/libra_arc/noyql']) - unit.onpeerdir(['yql/udfs/quality/libra/module']) - + if add_libra_modules: + unit.onpeerdir(['quality/user_sessions/libra_arc/noyql']) + unit.onpeerdir(['yql/udfs/quality/libra/module']) + if use_arcadia_python: flavor = 'Arcadia' unit.onpeerdir([ @@ -32,7 +32,7 @@ def onregister_yql_python_udf(unit, *args): 'yql/udfs/common/python/main' ] if not py3 else [ 'library/python/runtime_py3', - 'yql/udfs/common/python/main_py3' + 'yql/udfs/common/python/main_py3' ]) else: flavor = 'System' @@ -41,14 +41,14 @@ def onregister_yql_python_udf(unit, *args): 'yql/udfs/common/python/python_udf/python_udf.h', 'ydb/library/yql/public/udf/udf_registrator.h', ] - if add_libra_modules: - output_includes.append('yql/udfs/quality/libra/module/module.h') - + if add_libra_modules: + output_includes.append('yql/udfs/quality/libra/module/module.h') + path = name + '.yql_python_udf.cpp' - libra_flag = '1' if add_libra_modules else '0' + libra_flag = '1' if add_libra_modules else '0' unit.onpython([ 'build/scripts/gen_yql_python_udf.py', - flavor, name, resource_name, path, libra_flag, + flavor, name, resource_name, path, libra_flag, 'OUT', path, 'OUTPUT_INCLUDES', ] + output_includes diff --git a/build/scripts/gen_yql_python_udf.py b/build/scripts/gen_yql_python_udf.py index 13b5898117..e2dd7cc9e0 100644 --- a/build/scripts/gen_yql_python_udf.py +++ b/build/scripts/gen_yql_python_udf.py @@ -5,40 +5,40 @@ TEMPLATE=""" #include <ydb/library/yql/public/udf/udf_registrator.h> -#if @WITH_LIBRA@ -#include <yql/udfs/quality/libra/module/module.h> -#endif - +#if @WITH_LIBRA@ +#include <yql/udfs/quality/libra/module/module.h> +#endif + using namespace NKikimr::NUdf; #ifdef BUILD_UDF -#if @WITH_LIBRA@ -LIBRA_MODULE(TLibraModule, "Libra@MODULE_NAME@"); -#endif - -extern "C" UDF_API void Register(IRegistrator& registrator, ui32 flags) { +#if @WITH_LIBRA@ +LIBRA_MODULE(TLibraModule, "Libra@MODULE_NAME@"); +#endif + +extern "C" UDF_API void Register(IRegistrator& registrator, ui32 flags) { RegisterYqlPythonUdf(registrator, flags, TStringBuf("@MODULE_NAME@"), TStringBuf("@PACKAGE_NAME@"), EPythonFlavor::@FLAVOR@); -#if @WITH_LIBRA@ - RegisterHelper<TLibraModule>(registrator); -#endif -} - -extern "C" UDF_API ui32 AbiVersion() { - return CurrentAbiVersion(); -} - -extern "C" UDF_API void SetBackTraceCallback(TBackTraceCallback callback) { - SetBackTraceCallbackImpl(callback); -} - +#if @WITH_LIBRA@ + RegisterHelper<TLibraModule>(registrator); +#endif +} + +extern "C" UDF_API ui32 AbiVersion() { + return CurrentAbiVersion(); +} + +extern "C" UDF_API void SetBackTraceCallback(TBackTraceCallback callback) { + SetBackTraceCallbackImpl(callback); +} + #endif """ def main(): - assert len(sys.argv) == 6 - flavor, module_name, package_name, path, libra_flag = sys.argv[1:] + assert len(sys.argv) == 6 + flavor, module_name, package_name, path, libra_flag = sys.argv[1:] with open(path, 'w') as f: f.write( TEMPLATE @@ -46,7 +46,7 @@ def main(): .replace('@MODULE_NAME@', module_name) .replace('@PACKAGE_NAME@', package_name) .replace('@FLAVOR@', flavor) - .replace('@WITH_LIBRA@', libra_flag) + .replace('@WITH_LIBRA@', libra_flag) ) f.write('\n') diff --git a/library/cpp/yson_pull/detail/lexer_base.h b/library/cpp/yson_pull/detail/lexer_base.h index 572bdb3d18..61f0c21ca9 100644 --- a/library/cpp/yson_pull/detail/lexer_base.h +++ b/library/cpp/yson_pull/detail/lexer_base.h @@ -4,7 +4,7 @@ #include "cescape.h" #include "macros.h" #include "number.h" -#include "percent_scalar.h" +#include "percent_scalar.h" #include "stream_counter.h" #include "varint.h" @@ -199,17 +199,17 @@ namespace NYsonPull { return token_buffer(); } - percent_scalar read_percent_scalar() { - auto throw_incorrect_percent_scalar = [&]() { - Base::fail("Incorrect %-literal prefix ", NCEscape::quote(token_buffer())); + percent_scalar read_percent_scalar() { + auto throw_incorrect_percent_scalar = [&]() { + Base::fail("Incorrect %-literal prefix ", NCEscape::quote(token_buffer())); }; - auto assert_literal = [&](TStringBuf literal) -> void { - for (size_t i = 2; i < literal.size(); ++i) { + auto assert_literal = [&](TStringBuf literal) -> void { + for (size_t i = 2; i < literal.size(); ++i) { token_buffer_.push_back(this->Base::template get_byte<false>()); Base::advance(1); if (Y_UNLIKELY(token_buffer_.back() != literal[i])) { - throw_incorrect_percent_scalar(); + throw_incorrect_percent_scalar(); } } }; @@ -217,25 +217,25 @@ namespace NYsonPull { token_buffer_.clear(); token_buffer_.push_back(this->Base::template get_byte<false>()); Base::advance(1); - - switch (token_buffer_[0]) { - case 't': - assert_literal(percent_scalar::true_literal); - return percent_scalar(true); - case 'f': - assert_literal(percent_scalar::false_literal); - return percent_scalar(false); - case 'n': - assert_literal(percent_scalar::nan_literal); - return percent_scalar(std::numeric_limits<double>::quiet_NaN()); - case 'i': - assert_literal(percent_scalar::positive_inf_literal); - return percent_scalar(std::numeric_limits<double>::infinity()); - case '-': - assert_literal(percent_scalar::negative_inf_literal); - return percent_scalar(-std::numeric_limits<double>::infinity()); - default: - throw_incorrect_percent_scalar(); + + switch (token_buffer_[0]) { + case 't': + assert_literal(percent_scalar::true_literal); + return percent_scalar(true); + case 'f': + assert_literal(percent_scalar::false_literal); + return percent_scalar(false); + case 'n': + assert_literal(percent_scalar::nan_literal); + return percent_scalar(std::numeric_limits<double>::quiet_NaN()); + case 'i': + assert_literal(percent_scalar::positive_inf_literal); + return percent_scalar(std::numeric_limits<double>::infinity()); + case '-': + assert_literal(percent_scalar::negative_inf_literal); + return percent_scalar(-std::numeric_limits<double>::infinity()); + default: + throw_incorrect_percent_scalar(); } Y_UNREACHABLE(); diff --git a/library/cpp/yson_pull/detail/percent_scalar.h b/library/cpp/yson_pull/detail/percent_scalar.h index ff4571842e..beec425c7d 100644 --- a/library/cpp/yson_pull/detail/percent_scalar.h +++ b/library/cpp/yson_pull/detail/percent_scalar.h @@ -1,36 +1,36 @@ -#pragma once - -#include <util/generic/strbuf.h> - -namespace NYsonPull::NDetail { - enum class percent_scalar_type { - boolean, - float64 - }; - - struct percent_scalar { - //! Text boolean literals +#pragma once + +#include <util/generic/strbuf.h> + +namespace NYsonPull::NDetail { + enum class percent_scalar_type { + boolean, + float64 + }; + + struct percent_scalar { + //! Text boolean literals static constexpr TStringBuf true_literal = "%true"; static constexpr TStringBuf false_literal = "%false"; - //! Text floating-point literals + //! Text floating-point literals static constexpr TStringBuf nan_literal = "%nan"; static constexpr TStringBuf positive_inf_literal = "%inf"; static constexpr TStringBuf negative_inf_literal = "%-inf"; - - percent_scalar_type type; - union { - double as_float64; - bool as_boolean; - } value; - - percent_scalar(double v) { - type = percent_scalar_type::float64; - value.as_float64 = v; - } - - percent_scalar(bool v) { - type = percent_scalar_type::boolean; - value.as_boolean = v; - } - }; -} + + percent_scalar_type type; + union { + double as_float64; + bool as_boolean; + } value; + + percent_scalar(double v) { + type = percent_scalar_type::float64; + value.as_float64 = v; + } + + percent_scalar(bool v) { + type = percent_scalar_type::boolean; + value.as_boolean = v; + } + }; +} diff --git a/library/cpp/yson_pull/detail/reader.h b/library/cpp/yson_pull/detail/reader.h index 0e02396358..29a266edb9 100644 --- a/library/cpp/yson_pull/detail/reader.h +++ b/library/cpp/yson_pull/detail/reader.h @@ -300,18 +300,18 @@ namespace NYsonPull { } } - //! Present a value from %-literal variant - void yield(const percent_scalar& value) { - switch (value.type) { - case percent_scalar_type::boolean: - yield(value.value.as_boolean); - break; - case percent_scalar_type::float64: - yield(value.value.as_float64); - break; - } - } - + //! Present a value from %-literal variant + void yield(const percent_scalar& value) { + switch (value.type) { + case percent_scalar_type::boolean: + yield(value.value.as_boolean); + break; + case percent_scalar_type::float64: + yield(value.value.as_float64); + break; + } + } + //! Present a value-less event void yield(EEventType type) { event_ = TEvent{type}; @@ -654,7 +654,7 @@ namespace NYsonPull { case char_class::percent: lexer_.advance(1); - yield(lexer_.read_percent_scalar()); + yield(lexer_.read_percent_scalar()); break; case char_class::none: diff --git a/library/cpp/yson_pull/detail/writer.h b/library/cpp/yson_pull/detail/writer.h index b24b994292..2df6ee8906 100644 --- a/library/cpp/yson_pull/detail/writer.h +++ b/library/cpp/yson_pull/detail/writer.h @@ -2,7 +2,7 @@ #include "byte_writer.h" #include "cescape.h" -#include "percent_scalar.h" +#include "percent_scalar.h" #include "stream_counter.h" #include "symbols.h" #include "varint.h" @@ -385,7 +385,7 @@ namespace NYsonPull { } void OnScalarFloat64(double value) override { - update_state(EEventType::Scalar); + update_state(EEventType::Scalar); begin_node(); write(NSymbol::double_marker); @@ -425,7 +425,7 @@ namespace NYsonPull { update_state(EEventType::Scalar); begin_node(); - write(value ? percent_scalar::true_literal : percent_scalar::false_literal); + write(value ? percent_scalar::true_literal : percent_scalar::false_literal); end_node(); } @@ -455,20 +455,20 @@ namespace NYsonPull { void OnScalarFloat64(double value) override { update_state(EEventType::Scalar); - begin_node(); - - if (std::isfinite(value)) { - char buf[32]; - auto len = ::snprintf(buf, sizeof(buf), "%#.17lg", value); - write_raw(buf, len); - } else if (std::isnan(value)) { - write(percent_scalar::nan_literal); - } else if (value > 0) { - write(percent_scalar::positive_inf_literal); - } else { - write(percent_scalar::negative_inf_literal); + begin_node(); + + if (std::isfinite(value)) { + char buf[32]; + auto len = ::snprintf(buf, sizeof(buf), "%#.17lg", value); + write_raw(buf, len); + } else if (std::isnan(value)) { + write(percent_scalar::nan_literal); + } else if (value > 0) { + write(percent_scalar::positive_inf_literal); + } else { + write(percent_scalar::negative_inf_literal); } - + end_node(); } diff --git a/library/cpp/yson_pull/ut/reader_ut.cpp b/library/cpp/yson_pull/ut/reader_ut.cpp index 1184265ddb..586c91870a 100644 --- a/library/cpp/yson_pull/ut/reader_ut.cpp +++ b/library/cpp/yson_pull/ut/reader_ut.cpp @@ -21,20 +21,20 @@ namespace { template <> void expect_scalar(const NYsonPull::TScalar& scalar, double value) { UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Float64, scalar.Type()); - - auto scalarValue = scalar.AsFloat64(); - auto message = TStringBuilder() << "expected " << value << ", got " << scalarValue; - - if (std::isfinite(value)) { - UNIT_ASSERT_C(std::isfinite(scalarValue), message); - UNIT_ASSERT_DOUBLES_EQUAL(value, scalarValue, 1e-5); - } else if (std::isnan(value)) { - UNIT_ASSERT_C(std::isnan(scalarValue), message); - } else if (value > 0) { - UNIT_ASSERT_C(std::isinf(scalarValue) && (scalarValue > 0), message); - } else { - UNIT_ASSERT_C(std::isinf(scalarValue) && (scalarValue < 0), message); - } + + auto scalarValue = scalar.AsFloat64(); + auto message = TStringBuilder() << "expected " << value << ", got " << scalarValue; + + if (std::isfinite(value)) { + UNIT_ASSERT_C(std::isfinite(scalarValue), message); + UNIT_ASSERT_DOUBLES_EQUAL(value, scalarValue, 1e-5); + } else if (std::isnan(value)) { + UNIT_ASSERT_C(std::isnan(scalarValue), message); + } else if (value > 0) { + UNIT_ASSERT_C(std::isinf(scalarValue) && (scalarValue > 0), message); + } else { + UNIT_ASSERT_C(std::isinf(scalarValue) && (scalarValue < 0), message); + } } template <typename T> @@ -153,23 +153,23 @@ Y_UNIT_TEST_SUITE(Reader) { test_scalar( TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf8\x7f"sv), - double{std::numeric_limits<double>::quiet_NaN()}); - test_scalar( + double{std::numeric_limits<double>::quiet_NaN()}); + test_scalar( TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\x7f"sv), double{std::numeric_limits<double>::infinity()}); test_scalar( TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\xff"sv), double{-std::numeric_limits<double>::infinity()}); - test_scalar( + test_scalar( TStringBuf("%nan"), - double{std::numeric_limits<double>::quiet_NaN()}); - test_scalar( + double{std::numeric_limits<double>::quiet_NaN()}); + test_scalar( TStringBuf("%inf"), - double{std::numeric_limits<double>::infinity()}); - test_scalar( + double{std::numeric_limits<double>::infinity()}); + test_scalar( TStringBuf("%-inf"), - double{-std::numeric_limits<double>::infinity()}); + double{-std::numeric_limits<double>::infinity()}); REJECT("++0.0"); REJECT("++1.0"); @@ -184,13 +184,13 @@ Y_UNIT_TEST_SUITE(Reader) { // XXX: Rejected on Mac OS, accepted on Linux (?!) //REJECT(".0"); //REJECT(".5"); - - REJECT("%NaN"); - REJECT("%+inf"); - REJECT("%infinity"); - REJECT("%na"); - REJECT("%in"); - REJECT("%-in"); + + REJECT("%NaN"); + REJECT("%+inf"); + REJECT("%infinity"); + REJECT("%na"); + REJECT("%in"); + REJECT("%-in"); } Y_UNIT_TEST(ScalarString) { diff --git a/library/cpp/yson_pull/ut/writer_ut.cpp b/library/cpp/yson_pull/ut/writer_ut.cpp index 5c304bad0f..4a052e5274 100644 --- a/library/cpp/yson_pull/ut/writer_ut.cpp +++ b/library/cpp/yson_pull/ut/writer_ut.cpp @@ -123,14 +123,14 @@ Y_UNIT_TEST_SUITE(Writer) { Y_UNIT_TEST(TextFloat64) { UNIT_ASSERT_VALUES_EQUAL( - "%inf", + "%inf", to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::infinity()})); UNIT_ASSERT_VALUES_EQUAL( - "%-inf", + "%-inf", to_yson_text_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()})); - UNIT_ASSERT_VALUES_EQUAL( - "%nan", - to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()})); + UNIT_ASSERT_VALUES_EQUAL( + "%nan", + to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()})); } Y_UNIT_TEST(TextString) { @@ -230,15 +230,15 @@ Y_UNIT_TEST_SUITE(Writer) { UNIT_ASSERT_VALUES_EQUAL( TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\xff"sv), to_yson_binary_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()})); - UNIT_ASSERT_VALUES_EQUAL( + UNIT_ASSERT_VALUES_EQUAL( TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf8\x7f"sv), - to_yson_binary_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()})); - UNIT_ASSERT_VALUES_EQUAL( + to_yson_binary_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()})); + UNIT_ASSERT_VALUES_EQUAL( TStringBuf("\x03\x9a\x99\x99\x99\x99\x99\xf1\x3f"), - to_yson_binary_string(NYsonPull::TScalar{double{1.1}})); - UNIT_ASSERT_VALUES_EQUAL( + to_yson_binary_string(NYsonPull::TScalar{double{1.1}})); + UNIT_ASSERT_VALUES_EQUAL( TStringBuf("\x03\x9a\x99\x99\x99\x99\x99\xf1\xbf"), - to_yson_binary_string(NYsonPull::TScalar{double{-1.1}})); + to_yson_binary_string(NYsonPull::TScalar{double{-1.1}})); } Y_UNIT_TEST(BinaryString) { diff --git a/ydb/library/yql/core/expr_nodes/yql_expr_nodes.json b/ydb/library/yql/core/expr_nodes/yql_expr_nodes.json index edfcaa1530..541b85b0ba 100644 --- a/ydb/library/yql/core/expr_nodes/yql_expr_nodes.json +++ b/ydb/library/yql/core/expr_nodes/yql_expr_nodes.json @@ -1706,11 +1706,11 @@ "Match": {"Type": "Callable", "Name": "TablePath"} }, { - "Name": "TCoTableName", - "Base": "TCoTablePropBase", - "Match": {"Type": "Callable", "Name": "TableName"} - }, - { + "Name": "TCoTableName", + "Base": "TCoTablePropBase", + "Match": {"Type": "Callable", "Name": "TableName"} + }, + { "Name": "TCoTableRecord", "Base": "TCoTablePropBase", "Match": {"Type": "Callable", "Name": "TableRecord"} diff --git a/ydb/library/yql/sql/v1/builtin.cpp b/ydb/library/yql/sql/v1/builtin.cpp index 43ef1243f1..e877c6994b 100644 --- a/ydb/library/yql/sql/v1/builtin.cpp +++ b/ydb/library/yql/sql/v1/builtin.cpp @@ -2992,84 +2992,84 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec } } else if (ns == "datetime2" && (name == "Format" || name == "Parse")) { return BuildUdf(ctx, pos, nameSpace, name, args); - } else if (name == "MakeLibraPreprocessor") { - if (args.size() != 1) { - return new TInvalidBuiltin(pos, TStringBuilder() << name << " requires exactly one argument"); - } - - auto settings = NYT::TNode::CreateMap(); - - auto makeUdfArgs = [&args, &pos, &settings]() { - return TVector<TNodePtr> { - args[0], - new TCallNodeImpl(pos, "Void", {}), - BuildQuotedAtom(pos, NYT::NodeToYsonString(settings)) - }; - }; - - auto structNode = dynamic_cast<TStructNode*>(args[0].Get()); - if (!structNode) { - if (auto callNode = dynamic_cast<TCallNode*>(args[0].Get())) { - if (callNode->GetOpName() == "AsStruct") { - return BuildUdf(ctx, pos, nameSpace, name, makeUdfArgs()); - } - } - - return new TInvalidBuiltin(pos, TStringBuilder() << name << " requires struct as argument"); - } - - for (const auto& item : structNode->GetExprs()) { - const auto& label = item->GetLabel(); - if (label == "Entities") { - auto callNode = dynamic_cast<TCallNode*>(item.Get()); - if (!callNode || callNode->GetOpName() != "AsList") { - return new TInvalidBuiltin(pos, TStringBuilder() << name << " entities must be list of strings"); - } - - auto entities = NYT::TNode::CreateList(); - for (const auto& entity : callNode->GetArgs()) { - if (!entity->IsLiteral() || entity->GetLiteralType() != "String") { - return new TInvalidBuiltin(pos, TStringBuilder() << name << " entity must be string literal"); - } - entities.Add(entity->GetLiteralValue()); - } - - settings(label, std::move(entities)); - } else if (label == "EntitiesStrategy") { - if (!item->IsLiteral() || item->GetLiteralType() != "String") { - return new TInvalidBuiltin( - pos, TStringBuilder() << name << " entities strategy must be string literal" - ); - } - - if (!EqualToOneOf(item->GetLiteralValue(), "whitelist", "blacklist")) { - return new TInvalidBuiltin( - pos, - TStringBuilder() << name << " got invalid entities strategy: expected 'whitelist' or 'blacklist'" - ); - } - - settings(label, item->GetLiteralValue()); - } else if (label == "Mode") { - if (!item->IsLiteral() || item->GetLiteralType() != "String") { - return new TInvalidBuiltin( - pos, TStringBuilder() << name << " mode must be string literal" - ); - } - - settings(label, item->GetLiteralValue()); - } else if (EqualToOneOf(label, "BlockstatDict", "ParseWithFat")) { - continue; - } else { - return new TInvalidBuiltin( - pos, - TStringBuilder() - << name << " got unsupported setting: " << label - << "; supported: Entities, EntitiesStrategy, BlockstatDict, ParseWithFat" ); - } - } - - return BuildUdf(ctx, pos, nameSpace, name, makeUdfArgs()); + } else if (name == "MakeLibraPreprocessor") { + if (args.size() != 1) { + return new TInvalidBuiltin(pos, TStringBuilder() << name << " requires exactly one argument"); + } + + auto settings = NYT::TNode::CreateMap(); + + auto makeUdfArgs = [&args, &pos, &settings]() { + return TVector<TNodePtr> { + args[0], + new TCallNodeImpl(pos, "Void", {}), + BuildQuotedAtom(pos, NYT::NodeToYsonString(settings)) + }; + }; + + auto structNode = dynamic_cast<TStructNode*>(args[0].Get()); + if (!structNode) { + if (auto callNode = dynamic_cast<TCallNode*>(args[0].Get())) { + if (callNode->GetOpName() == "AsStruct") { + return BuildUdf(ctx, pos, nameSpace, name, makeUdfArgs()); + } + } + + return new TInvalidBuiltin(pos, TStringBuilder() << name << " requires struct as argument"); + } + + for (const auto& item : structNode->GetExprs()) { + const auto& label = item->GetLabel(); + if (label == "Entities") { + auto callNode = dynamic_cast<TCallNode*>(item.Get()); + if (!callNode || callNode->GetOpName() != "AsList") { + return new TInvalidBuiltin(pos, TStringBuilder() << name << " entities must be list of strings"); + } + + auto entities = NYT::TNode::CreateList(); + for (const auto& entity : callNode->GetArgs()) { + if (!entity->IsLiteral() || entity->GetLiteralType() != "String") { + return new TInvalidBuiltin(pos, TStringBuilder() << name << " entity must be string literal"); + } + entities.Add(entity->GetLiteralValue()); + } + + settings(label, std::move(entities)); + } else if (label == "EntitiesStrategy") { + if (!item->IsLiteral() || item->GetLiteralType() != "String") { + return new TInvalidBuiltin( + pos, TStringBuilder() << name << " entities strategy must be string literal" + ); + } + + if (!EqualToOneOf(item->GetLiteralValue(), "whitelist", "blacklist")) { + return new TInvalidBuiltin( + pos, + TStringBuilder() << name << " got invalid entities strategy: expected 'whitelist' or 'blacklist'" + ); + } + + settings(label, item->GetLiteralValue()); + } else if (label == "Mode") { + if (!item->IsLiteral() || item->GetLiteralType() != "String") { + return new TInvalidBuiltin( + pos, TStringBuilder() << name << " mode must be string literal" + ); + } + + settings(label, item->GetLiteralValue()); + } else if (EqualToOneOf(label, "BlockstatDict", "ParseWithFat")) { + continue; + } else { + return new TInvalidBuiltin( + pos, + TStringBuilder() + << name << " got unsupported setting: " << label + << "; supported: Entities, EntitiesStrategy, BlockstatDict, ParseWithFat" ); + } + } + + return BuildUdf(ctx, pos, nameSpace, name, makeUdfArgs()); } else if (scriptType != NKikimr::NMiniKQL::EScriptType::Unknown) { auto scriptName = NKikimr::NMiniKQL::ScriptTypeAsStr(scriptType); return new TScriptUdf(pos, TString(scriptName), name, args); diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp index 725356b9f5..6429ebe9cc 100644 --- a/ydb/library/yql/sql/v1/query.cpp +++ b/ydb/library/yql/sql/v1/query.cpp @@ -398,14 +398,14 @@ public: folder = L(folder, Args.size() > 1 ? Args[1].Id.Build() : BuildQuotedAtom(Pos, "")); return folder; } - else if (func == "tables") { - if (!Args.empty()) { - ctx.Error(Pos) << Func << " doesn't accept arguments"; - return nullptr; - } - - return L(Y("DataTables")); - } + else if (func == "tables") { + if (!Args.empty()) { + ctx.Error(Pos) << Func << " doesn't accept arguments"; + return nullptr; + } + + return L(Y("DataTables")); + } else if (func == "object") { const size_t positionalArgs = 2; auto result = Y("MrObject"); diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp index ab5a864788..f4d121741b 100644 --- a/ydb/library/yql/sql/v1/sql.cpp +++ b/ydb/library/yql/sql/v1/sql.cpp @@ -1599,23 +1599,23 @@ bool TSqlTranslation::TableRefImpl(const TRule_table_ref& node, TTableRef& resul auto& alt = block.GetAlt2(); const TString func(Id(alt.GetRule_an_id_expr1(), *this)); - TVector<TTableArg> args; - if (alt.HasBlock3()) { - auto& argsBlock = alt.GetBlock3(); - auto arg = TableArgImpl(argsBlock.GetRule_table_arg1()); + TVector<TTableArg> args; + if (alt.HasBlock3()) { + auto& argsBlock = alt.GetBlock3(); + auto arg = TableArgImpl(argsBlock.GetRule_table_arg1()); if (!arg) { return false; } - args.push_back(std::move(*arg)); - for (auto& b : argsBlock.GetBlock2()) { - arg = TableArgImpl(b.GetRule_table_arg2()); - if (!arg) { - return false; - } - - args.push_back(std::move(*arg)); - } + args.push_back(std::move(*arg)); + for (auto& b : argsBlock.GetBlock2()) { + arg = TableArgImpl(b.GetRule_table_arg2()); + if (!arg) { + return false; + } + + args.push_back(std::move(*arg)); + } } tableHints = GetTableFuncHints(func); tr.Keys = BuildTableKeys(pos, service, cluster, func, args); @@ -1762,7 +1762,7 @@ TMaybe<TSourcePtr> TSqlTranslation::AsTableImpl(const TRule_table_ref& node) { return TMaybe<TSourcePtr>(nullptr); } - if (!alt.HasBlock3() || !alt.GetBlock3().GetBlock2().empty()) { + if (!alt.HasBlock3() || !alt.GetBlock3().GetBlock2().empty()) { Ctx.Error() << "Expected single argument for AS_TABLE source"; return TMaybe<TSourcePtr>(nullptr); } @@ -1772,7 +1772,7 @@ TMaybe<TSourcePtr> TSqlTranslation::AsTableImpl(const TRule_table_ref& node) { return TMaybe<TSourcePtr>(nullptr); } - auto arg = TableArgImpl(alt.GetBlock3().GetRule_table_arg1()); + auto arg = TableArgImpl(alt.GetBlock3().GetRule_table_arg1()); if (!arg) { return TMaybe<TSourcePtr>(nullptr); } diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp index 85b6e0dfcd..4bac8cb1cc 100644 --- a/ydb/library/yql/sql/v1/sql_ut.cpp +++ b/ydb/library/yql/sql/v1/sql_ut.cpp @@ -4018,76 +4018,76 @@ Y_UNIT_TEST_SUITE(SessionWindowNegative) { UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:2:13: Error: SessionWindow is unsupported for streaming sources\n"); } } - -Y_UNIT_TEST_SUITE(LibraSqlSugar) { - auto makeResult = [](TStringBuf settings) { - return SqlToYql( - TStringBuilder() - << settings - << "\n$udf1 = MyLibra::MakeLibraPreprocessor($settings);" - << "\n$udf2 = CustomLibra::MakeLibraPreprocessor($settings);" - << "\nPROCESS plato.Input USING $udf1(TableRow())" - << "\nUNION ALL" - << "\nPROCESS plato.Input USING $udf2(TableRow());" - ); - }; - - Y_UNIT_TEST(EmptySettings) { - auto res = makeResult(R"( - $settings = AsStruct(); - )"); - UNIT_ASSERT(res.IsOk()); - } - - Y_UNIT_TEST(OnlyEntities) { - auto res = makeResult(R"( - $settings = AsStruct( - AsList("A", "B", "C") AS Entities - ); - )"); - UNIT_ASSERT(res.IsOk()); - } - - Y_UNIT_TEST(EntitiesWithStrategy) { - auto res = makeResult(R"( - $settings = AsStruct( - AsList("A", "B", "C") AS Entities, - "blacklist" AS EntitiesStrategy - ); - )"); - UNIT_ASSERT(res.IsOk()); - } - - Y_UNIT_TEST(AllSettings) { - auto res = makeResult(R"( - $settings = AsStruct( - AsList("A", "B", "C") AS Entities, - "whitelist" AS EntitiesStrategy, - "path" AS BlockstatDict, - false AS ParseWithFat, - "map" AS Mode - ); - )"); - UNIT_ASSERT(res.IsOk()); - } - - Y_UNIT_TEST(BadStrategy) { - auto res = makeResult(R"( - $settings = AsStruct("bad" AS EntitiesStrategy); - )"); - UNIT_ASSERT_STRING_CONTAINS( - Err2Str(res), - "Error: MakeLibraPreprocessor got invalid entities strategy: expected 'whitelist' or 'blacklist'" - ); - } - - Y_UNIT_TEST(BadEntities) { - auto res = makeResult(R"( - $settings = AsStruct(AsList("A", 1) AS Entities); - )"); - UNIT_ASSERT_STRING_CONTAINS(Err2Str(res), "Error: MakeLibraPreprocessor entity must be string literal"); - } -} + +Y_UNIT_TEST_SUITE(LibraSqlSugar) { + auto makeResult = [](TStringBuf settings) { + return SqlToYql( + TStringBuilder() + << settings + << "\n$udf1 = MyLibra::MakeLibraPreprocessor($settings);" + << "\n$udf2 = CustomLibra::MakeLibraPreprocessor($settings);" + << "\nPROCESS plato.Input USING $udf1(TableRow())" + << "\nUNION ALL" + << "\nPROCESS plato.Input USING $udf2(TableRow());" + ); + }; + + Y_UNIT_TEST(EmptySettings) { + auto res = makeResult(R"( + $settings = AsStruct(); + )"); + UNIT_ASSERT(res.IsOk()); + } + + Y_UNIT_TEST(OnlyEntities) { + auto res = makeResult(R"( + $settings = AsStruct( + AsList("A", "B", "C") AS Entities + ); + )"); + UNIT_ASSERT(res.IsOk()); + } + + Y_UNIT_TEST(EntitiesWithStrategy) { + auto res = makeResult(R"( + $settings = AsStruct( + AsList("A", "B", "C") AS Entities, + "blacklist" AS EntitiesStrategy + ); + )"); + UNIT_ASSERT(res.IsOk()); + } + + Y_UNIT_TEST(AllSettings) { + auto res = makeResult(R"( + $settings = AsStruct( + AsList("A", "B", "C") AS Entities, + "whitelist" AS EntitiesStrategy, + "path" AS BlockstatDict, + false AS ParseWithFat, + "map" AS Mode + ); + )"); + UNIT_ASSERT(res.IsOk()); + } + + Y_UNIT_TEST(BadStrategy) { + auto res = makeResult(R"( + $settings = AsStruct("bad" AS EntitiesStrategy); + )"); + UNIT_ASSERT_STRING_CONTAINS( + Err2Str(res), + "Error: MakeLibraPreprocessor got invalid entities strategy: expected 'whitelist' or 'blacklist'" + ); + } + + Y_UNIT_TEST(BadEntities) { + auto res = makeResult(R"( + $settings = AsStruct(AsList("A", 1) AS Entities); + )"); + UNIT_ASSERT_STRING_CONTAINS(Err2Str(res), "Error: MakeLibraPreprocessor entity must be string literal"); + } +} Y_UNIT_TEST_SUITE(TrailingQuestionsNegative) { Y_UNIT_TEST(Basic) { |