diff options
author | debnatkh <debnatkh@yandex-team.com> | 2023-08-10 13:39:07 +0300 |
---|---|---|
committer | debnatkh <debnatkh@yandex-team.com> | 2023-08-10 15:13:39 +0300 |
commit | c5edd93801037f77832d935319eb95cc7a1ff39f (patch) | |
tree | 88a0a6bb238fa1a110cade0eea0b30465290dc79 | |
parent | ccc51cee025ff0b2d368a4eeb8e93fe8511c3537 (diff) | |
download | ydb-c5edd93801037f77832d935319eb95cc7a1ff39f.tar.gz |
YQL-16215: support escaping in JsonPath

10 files changed, 27 insertions, 8 deletions
diff --git a/ydb/library/yql/minikql/computation/ya.make b/ydb/library/yql/minikql/computation/ya.make deleted file mode 100644 index c5e138b8b52..00000000000 --- a/ydb/library/yql/minikql/computation/ya.make +++ /dev/null @@ -1,2 +0,0 @@ -RECURSE(llvm no_llvm) -RECURSE_FOR_TESTS(ut) diff --git a/ydb/library/yql/minikql/invoke_builtins/ya.make b/ydb/library/yql/minikql/invoke_builtins/ya.make deleted file mode 100644 index c5e138b8b52..00000000000 --- a/ydb/library/yql/minikql/invoke_builtins/ya.make +++ /dev/null @@ -1,2 +0,0 @@ -RECURSE(llvm no_llvm) -RECURSE_FOR_TESTS(ut) diff --git a/ydb/library/yql/minikql/jsonpath/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/minikql/jsonpath/CMakeLists.darwin-x86_64.txt index 5609a579c18..bb96e932dc2 100644 --- a/ydb/library/yql/minikql/jsonpath/CMakeLists.darwin-x86_64.txt +++ b/ydb/library/yql/minikql/jsonpath/CMakeLists.darwin-x86_64.txt @@ -33,6 +33,7 @@ target_link_libraries(yql-minikql-jsonpath PUBLIC yql-minikql-dom yql-public-issue yql-public-udf + library-yql-ast library-yql-utils core-issue-protos yql-parser-proto_ast diff --git a/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-aarch64.txt b/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-aarch64.txt index 4ac1a6a035a..09049a15249 100644 --- a/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-aarch64.txt +++ b/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-aarch64.txt @@ -33,6 +33,7 @@ target_link_libraries(yql-minikql-jsonpath PUBLIC yql-minikql-dom yql-public-issue yql-public-udf + library-yql-ast library-yql-utils core-issue-protos yql-parser-proto_ast diff --git a/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-x86_64.txt b/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-x86_64.txt index e937c715659..033eee4ae6c 100644 --- a/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-x86_64.txt +++ b/ydb/library/yql/minikql/jsonpath/CMakeLists.linux-x86_64.txt @@ -34,6 +34,7 @@ target_link_libraries(yql-minikql-jsonpath PUBLIC yql-minikql-dom yql-public-issue yql-public-udf + library-yql-ast library-yql-utils core-issue-protos yql-parser-proto_ast diff --git a/ydb/library/yql/minikql/jsonpath/CMakeLists.windows-x86_64.txt b/ydb/library/yql/minikql/jsonpath/CMakeLists.windows-x86_64.txt index 5609a579c18..bb96e932dc2 100644 --- a/ydb/library/yql/minikql/jsonpath/CMakeLists.windows-x86_64.txt +++ b/ydb/library/yql/minikql/jsonpath/CMakeLists.windows-x86_64.txt @@ -33,6 +33,7 @@ target_link_libraries(yql-minikql-jsonpath PUBLIC yql-minikql-dom yql-public-issue yql-public-udf + library-yql-ast library-yql-utils core-issue-protos yql-parser-proto_ast diff --git a/ydb/library/yql/minikql/jsonpath/ast_builder.cpp b/ydb/library/yql/minikql/jsonpath/ast_builder.cpp index f6bed23d82c..96e514021b9 100644 --- a/ydb/library/yql/minikql/jsonpath/ast_builder.cpp +++ b/ydb/library/yql/minikql/jsonpath/ast_builder.cpp @@ -4,6 +4,7 @@ #include <ydb/library/yql/core/issue/protos/issue_id.pb.h> #include <ydb/library/rewrapper/proto/serialization.pb.h> +#include <ydb/library/yql/ast/yql_ast_escaping.h> #include <util/generic/singleton.h> #include <util/system/compiler.h> @@ -42,8 +43,21 @@ bool TryStringContent(const TString& str, TString& result, TString& error, bool return false; } - result = str.substr(1, str.length() - 2); - return true; + char quoteChar = doubleQuoted ? '"' : '\''; + size_t readBytes = 0; + TStringBuf atom(str); + atom.Skip(1); + TStringOutput sout(result); + result.reserve(str.size()); + + auto unescapeResult = UnescapeArbitraryAtom(atom, quoteChar, &sout, &readBytes); + + if (unescapeResult == EUnescapeResult::OK) { + return true; + } else { + error = UnescapeResultToString(unescapeResult); + return false; + } } } diff --git a/ydb/library/yql/minikql/jsonpath/ut/common_ut.cpp b/ydb/library/yql/minikql/jsonpath/ut/common_ut.cpp index 6999564f71c..47a6c68458a 100644 --- a/ydb/library/yql/minikql/jsonpath/ut/common_ut.cpp +++ b/ydb/library/yql/minikql/jsonpath/ut/common_ut.cpp @@ -107,6 +107,10 @@ public: {R"({"key": 123, "_another_28_key_$_": 456})", "$._another_28_key_$_", {"456"}}, {R"({"key": 123, "another_key": 456})", " $.another_key ", {"456"}}, + {R"({"key": 123, "another_key": 456})", "$.key", {"123"}}, + {R"({"k\"ey": 123, "another_key": 456})", "$.\"k\\\"ey\"", {"123"}}, + {R"({"k\"ey": 123, "another_key": 456})", "$.'k\\\"ey'", {"123"}}, + {R"({"key": 123, "another_key": 456})", "$.'key'", {"123"}}, {R"({"key": 123, "_another_28_key_$_": 456})", "$.'_another_28_key_$_'", {"456"}}, {R"({"key": 123, "another_key": 456})", " $.'another_key' ", {"456"}}, diff --git a/ydb/library/yql/minikql/jsonpath/ut/ya.make b/ydb/library/yql/minikql/jsonpath/ut/ya.make index 2d34544b601..b70b7a77af1 100644 --- a/ydb/library/yql/minikql/jsonpath/ut/ya.make +++ b/ydb/library/yql/minikql/jsonpath/ut/ya.make @@ -15,9 +15,9 @@ PEERDIR( library/cpp/json ydb/library/binary_json ydb/library/yql/minikql - ydb/library/yql/minikql/computation + ydb/library/yql/minikql/computation/llvm ydb/library/yql/minikql/dom - ydb/library/yql/minikql/invoke_builtins + ydb/library/yql/minikql/invoke_builtins/llvm ydb/library/yql/public/udf/service/exception_policy ydb/library/yql/core/issue/protos ydb/library/yql/sql/pg_dummy diff --git a/ydb/library/yql/minikql/jsonpath/ya.make b/ydb/library/yql/minikql/jsonpath/ya.make index de4f2682b6c..629d6246463 100644 --- a/ydb/library/yql/minikql/jsonpath/ya.make +++ b/ydb/library/yql/minikql/jsonpath/ya.make @@ -31,6 +31,7 @@ PEERDIR( ydb/library/yql/minikql/dom ydb/library/yql/public/issue ydb/library/yql/public/udf + ydb/library/yql/ast ydb/library/yql/utils ydb/library/yql/core/issue/protos ydb/library/yql/parser/proto_ast |