Skip to content

Commit 96c277d

Browse files
vitstnblinkov
authored andcommitted
Introduced SQL ITranslator
commit_hash:f58b2fb436f14fc4a11ce2e315f10d71e6d1ec77
1 parent 4aef952 commit 96c277d

File tree

14 files changed

+329
-34
lines changed

14 files changed

+329
-34
lines changed

yql/essentials/parser/pg_wrapper/interface/parser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
namespace NSQLTranslation {
77

88
struct TTranslationSettings;
9+
class ITranslator;
10+
using TTranslatorPtr = TIntrusivePtr<ITranslator>;
911

1012
} // NSQLTranslation
1113

@@ -16,5 +18,6 @@ TVector<NYql::TAstParseResult> PGToYqlStatements(const TString& query, const NSQ
1618
std::unique_ptr<NYql::NPg::IExtensionSqlParser> CreateExtensionSqlParser();
1719
std::unique_ptr<NYql::NPg::ISystemFunctionsParser> CreateSystemFunctionsParser();
1820
std::unique_ptr<NYql::NPg::ISqlLanguageParser> CreateSqlLanguageParser();
21+
NSQLTranslation::TTranslatorPtr MakeTranslator();
1922

2023
} // NSQLTranslationPG

yql/essentials/sql/pg/pg_sql.cpp

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extern "C" {
2929
#include "utils.h"
3030
#include <yql/essentials/ast/yql_expr.h>
3131
#include <yql/essentials/sql/settings/partitioning.h>
32+
#include <yql/essentials/sql/settings/translator.h>
3233
#include <yql/essentials/parser/pg_wrapper/interface/config.h>
3334
#include <yql/essentials/parser/pg_wrapper/interface/parser.h>
3435
#include <yql/essentials/parser/pg_wrapper/interface/utils.h>
@@ -1665,7 +1666,7 @@ class TConverter : public IPGParseEvents {
16651666
const auto select = ParseSelectStmt(
16661667
&selectStmt,
16671668
{
1668-
.Inner = true,
1669+
.Inner = true,
16691670
.AllowEmptyResSet = true,
16701671
.EmitPgStar = true,
16711672
.FillTargetColumns = false,
@@ -2971,7 +2972,7 @@ class TConverter : public IPGParseEvents {
29712972
return State.Statements.back();
29722973
}
29732974

2974-
[[nodiscard]]
2975+
[[nodiscard]]
29752976
TAstNode* ParseAlterTableStmt(const AlterTableStmt* value) {
29762977
std::vector<TAstNode*> options;
29772978
TString mode = (value->missing_ok) ? "alter_if_exists" : "alter";
@@ -3015,7 +3016,7 @@ class TConverter : public IPGParseEvents {
30153016
return nullptr;
30163017
}
30173018
const A_Const* localConst = nullptr;
3018-
if (NodeTag(rawArg) == T_TypeCast) {
3019+
if (NodeTag(rawArg) == T_TypeCast) {
30193020
auto localCast = CAST_NODE(TypeCast, rawArg)->arg;
30203021
if (NodeTag(localCast) != T_A_Const) {
30213022
AddError(TStringBuilder() << "Expected a_const in cast, but got something wrong: " << NodeTag(localCast));
@@ -3043,7 +3044,7 @@ class TConverter : public IPGParseEvents {
30433044
NodeNotImplemented(def);
30443045
return nullptr;
30453046
}
3046-
break;
3047+
break;
30473048
}
30483049
default:
30493050
NodeNotImplemented(rawNode);
@@ -3054,7 +3055,7 @@ class TConverter : public IPGParseEvents {
30543055
std::vector<TAstNode*> actions { QL(QA("alterColumns"), QVL(alterColumns.data(), alterColumns.size())) };
30553056

30563057
options.push_back(
3057-
QL(QA("actions"),
3058+
QL(QA("actions"),
30583059
QVL(actions.data(), actions.size())
30593060
)
30603061
);
@@ -4037,7 +4038,7 @@ class TConverter : public IPGParseEvents {
40374038
for (const auto& s : argStrs) {
40384039
concatArgs.push_back(L(A("Key"), QL(QA("table"),L(A("String"), QAX(s)))));
40394040
}
4040-
4041+
40414042
key = VL(concatArgs);
40424043
} else if (lowerName == "concat_view") {
40434044
if (argStrs.size() % 2 != 0) {
@@ -4048,11 +4049,11 @@ class TConverter : public IPGParseEvents {
40484049
TVector<TAstNode*> concatArgs;
40494050
concatArgs.push_back(A("MrTableConcat"));
40504051
for (ui32 i = 0; i < argStrs.size(); i += 2) {
4051-
concatArgs.push_back(L(A("Key"),
4052+
concatArgs.push_back(L(A("Key"),
40524053
QL(QA("table"),L(A("String"), QAX(argStrs[i]))),
40534054
QL(QA("view"),L(A("String"), QAX(argStrs[i + 1])))));
40544055
}
4055-
4056+
40564057
key = VL(concatArgs);
40574058
} else if (lowerName == "range") {
40584059
if (argStrs.size() > 5) {
@@ -4094,8 +4095,8 @@ class TConverter : public IPGParseEvents {
40944095
A("item"));
40954096
} else {
40964097
expr = L(A("Apply"),L(A("Udf"),QA("Re2.Match"),
4097-
QL(L(A("Apply"),
4098-
L(A("Udf"), QA("Re2.PatternFromLike")),
4098+
QL(L(A("Apply"),
4099+
L(A("Udf"), QA("Re2.PatternFromLike")),
40994100
L(A("String"),QAX(argStrs[1]))),L(A("Null")))),
41004101
A("item"));
41014102
}
@@ -5806,8 +5807,8 @@ class TExtensionHandler : public IPGParseEvents {
58065807

58075808
if (!leftType) {
58085809
return false;
5809-
}
5810-
5810+
}
5811+
58115812
if (procedureName.empty()) {
58125813
return false;
58135814
}
@@ -6194,13 +6195,13 @@ class TExtensionHandler : public IPGParseEvents {
61946195
desc.Family = familyName;
61956196
TVector<NPg::TAmOpDesc> ops;
61966197
TVector<NPg::TAmProcDesc> procs;
6197-
6198+
61986199
for (int i = 0; i < ListLength(value->items); ++i) {
61996200
auto node = LIST_CAST_NTH(CreateOpClassItem, value->items, i);
62006201
if (node->itemtype != OPCLASS_ITEM_OPERATOR && node->itemtype != OPCLASS_ITEM_FUNCTION) {
62016202
continue;
62026203
}
6203-
6204+
62046205
if (ListLength(node->name->objname) != 1) {
62056206
return false;
62066207
}
@@ -6422,4 +6423,47 @@ std::unique_ptr<NYql::NPg::ISqlLanguageParser> CreateSqlLanguageParser() {
64226423
return std::make_unique<TSqlLanguageParser>();
64236424
}
64246425

6426+
class TTranslator : public NSQLTranslation::ITranslator {
6427+
public:
6428+
NSQLTranslation::ILexer::TPtr MakeLexer(const NSQLTranslation::TTranslationSettings& settings) final {
6429+
Y_UNUSED(settings);
6430+
ythrow yexception() << "Unsupported method";
6431+
}
6432+
6433+
NYql::TAstParseResult TextToAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
6434+
NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
6435+
Y_UNUSED(warningRules);
6436+
return PGToYql(query, settings, stmtParseInfo);
6437+
}
6438+
6439+
google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
6440+
NYql::TIssues& issues, size_t maxErrors, const NSQLTranslation::TTranslationSettings& settings) final {
6441+
Y_UNUSED(query);
6442+
Y_UNUSED(queryName);
6443+
Y_UNUSED(issues);
6444+
Y_UNUSED(maxErrors);
6445+
Y_UNUSED(settings);
6446+
ythrow yexception() << "Unsupported method";
6447+
}
6448+
6449+
NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
6450+
const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings) final {
6451+
Y_UNUSED(query);
6452+
Y_UNUSED(protoAst);
6453+
Y_UNUSED(hints);
6454+
Y_UNUSED(settings);
6455+
ythrow yexception() << "Unsupported method";
6456+
}
6457+
6458+
TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
6459+
NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
6460+
Y_UNUSED(warningRules);
6461+
return PGToYqlStatements(query, settings, stmtParseInfo);
6462+
}
6463+
};
6464+
6465+
NSQLTranslation::TTranslatorPtr MakeTranslator() {
6466+
return MakeIntrusive<TTranslator>();
6467+
}
6468+
64256469
} // NSQLTranslationPG

yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <yql/essentials/minikql/computation/mkql_computation_node_pack_impl.h>
44
#include <yql/essentials/minikql/mkql_buffer.h>
5+
#include <yql/essentials/sql/settings/translator.h>
56

67
namespace NSQLTranslationPG {
78

@@ -33,6 +34,10 @@ std::unique_ptr<NYql::NPg::ISqlLanguageParser> CreateSqlLanguageParser() {
3334
throw yexception() << "CreateSqlLanguageParser: PG types are not supported";
3435
}
3536

37+
NSQLTranslation::TTranslatorPtr MakeTranslator() {
38+
return NSQLTranslation::MakeDummyTranslator("pg");
39+
}
40+
3641
} // NSQLTranslationPG
3742

3843
namespace NYql {

yql/essentials/sql/pg_dummy/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ PROVIDES(
88
PEERDIR(
99
yql/essentials/parser/pg_wrapper/interface
1010
yql/essentials/minikql
11+
yql/essentials/sql/settings
1112
)
1213

1314
SRCS(
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "translator.h"
2+
3+
namespace NSQLTranslation {
4+
5+
namespace {
6+
7+
class TDummyTranslator : public ITranslator {
8+
public:
9+
TDummyTranslator(const TString& name)
10+
: Name_(name)
11+
{}
12+
13+
NSQLTranslation::ILexer::TPtr MakeLexer(const NSQLTranslation::TTranslationSettings& settings) final {
14+
Y_UNUSED(settings);
15+
ThrowNotSupported();
16+
}
17+
18+
NYql::TAstParseResult TextToAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
19+
NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
20+
Y_UNUSED(query);
21+
Y_UNUSED(settings);
22+
Y_UNUSED(warningRules);
23+
Y_UNUSED(stmtParseInfo);
24+
ThrowNotSupported();
25+
}
26+
27+
google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
28+
NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) final {
29+
Y_UNUSED(query);
30+
Y_UNUSED(queryName);
31+
Y_UNUSED(issues);
32+
Y_UNUSED(maxErrors);
33+
Y_UNUSED(settings);
34+
ThrowNotSupported();
35+
}
36+
37+
NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
38+
const TSQLHints& hints, const TTranslationSettings& settings) final {
39+
Y_UNUSED(query);
40+
Y_UNUSED(protoAst);
41+
Y_UNUSED(hints);
42+
Y_UNUSED(settings);
43+
ThrowNotSupported();
44+
}
45+
46+
TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const TTranslationSettings& settings,
47+
NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
48+
Y_UNUSED(query);
49+
Y_UNUSED(settings);
50+
Y_UNUSED(warningRules);
51+
Y_UNUSED(stmtParseInfo);
52+
ThrowNotSupported();
53+
}
54+
55+
private:
56+
[[noreturn]] void ThrowNotSupported() {
57+
throw yexception() << "Translator '" << Name_ << "' is not supported";
58+
}
59+
60+
private:
61+
const TString Name_;
62+
};
63+
64+
}
65+
66+
TTranslatorPtr MakeDummyTranslator(const TString& name) {
67+
return MakeIntrusive<TDummyTranslator>(name);
68+
}
69+
70+
} // namespace NSQLTranslation
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
#include "translation_settings.h"
3+
4+
#include <yql/essentials/parser/lexer_common/lexer.h>
5+
#include <yql/essentials/parser/lexer_common/hints.h>
6+
#include <yql/essentials/public/issue/yql_warning.h>
7+
#include <yql/essentials/ast/yql_ast.h>
8+
9+
namespace NSQLTranslation {
10+
11+
class ITranslator : public TThrRefBase {
12+
public:
13+
virtual ~ITranslator() = default;
14+
15+
virtual ILexer::TPtr MakeLexer(const TTranslationSettings& settings) = 0;
16+
virtual NYql::TAstParseResult TextToAst(const TString& query, const TTranslationSettings& settings,
17+
NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) = 0;
18+
virtual google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
19+
NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) = 0;
20+
virtual NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
21+
const TSQLHints& hints, const TTranslationSettings& settings) = 0;
22+
virtual TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const TTranslationSettings& settings,
23+
NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) = 0;
24+
};
25+
26+
using TTranslatorPtr = TIntrusivePtr<ITranslator>;
27+
28+
TTranslatorPtr MakeDummyTranslator(const TString& name);
29+
30+
} // namespace NSQLTranslation

yql/essentials/sql/settings/ya.make

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ LIBRARY()
33
SRCS(
44
partitioning.cpp
55
translation_settings.cpp
6+
translator.cpp
67
)
78

89
PEERDIR(
910
library/cpp/deprecated/split
1011
library/cpp/json
12+
yql/essentials/public/issue
1113
yql/essentials/core/issue
1214
yql/essentials/core/pg_settings
1315
yql/essentials/core/issue/protos

0 commit comments

Comments
 (0)