1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include "proto_parser.h"
#include <yql/essentials/utils/yql_panic.h>
#include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
#include <yql/essentials/sql/v1/proto_parser/antlr3/proto_parser.h>
#include <yql/essentials/sql/v1/proto_parser/antlr3_ansi/proto_parser.h>
#include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
#include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
#include <util/generic/algorithm.h>
#if defined(_tsan_enabled_)
#include <util/system/mutex.h>
#endif
using namespace NYql;
namespace NSQLTranslationV1 {
#if defined(_tsan_enabled_)
TMutex SanitizerSQLTranslationMutex;
#endif
namespace {
void ReportError(NProtoAST::IErrorCollector& err, const TString& name) {
err.Error(0, 0, TStringBuilder() << "Parser " << name << " is not supported");
}
}
google::protobuf::Message* SqlAST(const TParsers& parsers, const TString& query, const TString& queryName, TIssues& err,
size_t maxErrors, bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
NSQLTranslation::TErrorCollectorOverIssues collector(err, maxErrors, queryName);
return SqlAST(parsers, query, queryName, collector, ansiLexer, anlr4Parser, arena);
}
google::protobuf::Message* SqlAST(const TParsers& parsers, const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
YQL_ENSURE(arena);
#if defined(_tsan_enabled_)
TGuard<TMutex> grd(SanitizerSQLTranslationMutex);
#endif
if (ansiLexer && !anlr4Parser) {
google::protobuf::Message* res = nullptr;
if (parsers.Antlr3Ansi) {
res = parsers.Antlr3Ansi->MakeParser()->Parse(query, queryName, err, arena);
if (!res) {
return res;
}
} else {
ReportError(err, "antlr3_ansi");
return nullptr;
}
return res;
} else if (!ansiLexer && !anlr4Parser) {
google::protobuf::Message* res = nullptr;
if (parsers.Antlr3) {
res = parsers.Antlr3->MakeParser()->Parse(query, queryName, err, arena);
if (!res) {
return res;
}
} else {
ReportError(err, "antlr3");
return nullptr;
}
return res;
} else if (ansiLexer && anlr4Parser) {
google::protobuf::Message* res = nullptr;
if (parsers.Antlr4Ansi) {
res = parsers.Antlr4Ansi->MakeParser()->Parse(query, queryName, err, arena);
if (!res) {
return res;
}
} else {
ReportError(err, "antlr4_ansi");
return nullptr;
}
return res;
} else {
google::protobuf::Message* res = nullptr;
if (parsers.Antlr4) {
res = parsers.Antlr4->MakeParser()->Parse(query, queryName, err, arena);
if (!res) {
return res;
}
} else {
ReportError(err, "antlr4");
return nullptr;
}
return res;
}
}
google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
NYql::TIssues& err, size_t maxErrors, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
Y_UNUSED(testAntlr4);
return SqlAST(MakeAllParsers(), query, queryName, err, maxErrors, ansiLexer, antlr4Parser, arena);
}
google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
NProtoAST::IErrorCollector& err, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
Y_UNUSED(testAntlr4);
return SqlAST(MakeAllParsers(), query, queryName, err, ansiLexer, antlr4Parser, arena);
}
TParsers MakeAllParsers() {
return TParsers {
.Antlr3 = MakeAntlr3ParserFactory(),
.Antlr3Ansi = MakeAntlr3AnsiParserFactory(),
.Antlr4 = MakeAntlr4ParserFactory(),
.Antlr4Ansi = MakeAntlr4AnsiParserFactory()
};
}
} // namespace NSQLTranslationV1
|