summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-02-19 17:28:26 +0300
committervvvv <[email protected]>2025-02-19 17:46:38 +0300
commit52daccf61e2e827114cfb3372071cddaec7974ba (patch)
tree07404f6ec241c8a2b96a4da07dc0f0d0c247799c
parentca4b5f28703b0d06599c94f3eacc5d6c498c31d5 (diff)
YQL-19594 Explicit lexers & parsers
commit_hash:6be543b7c5bff6ee474ee606c920197fb2569767
-rw-r--r--yql/essentials/parser/lexer_common/ut/hints_ut.cpp22
-rw-r--r--yql/essentials/parser/lexer_common/ut/ya.make1
-rw-r--r--yql/essentials/public/fastcheck/format.cpp12
-rw-r--r--yql/essentials/public/fastcheck/lexer.cpp7
-rw-r--r--yql/essentials/public/fastcheck/parser.cpp16
-rw-r--r--yql/essentials/public/fastcheck/ya.make4
-rw-r--r--yql/essentials/public/sql_format/sql_format.cpp21
-rw-r--r--yql/essentials/public/sql_format/sql_format.h8
-rw-r--r--yql/essentials/public/sql_format/ya.make15
-rw-r--r--yql/essentials/public/ya.make1
-rw-r--r--yql/essentials/sql/v1/context.cpp12
-rw-r--r--yql/essentials/sql/v1/context.h18
-rw-r--r--yql/essentials/sql/v1/format/sql_format.cpp38
-rw-r--r--yql/essentials/sql/v1/format/sql_format.h12
-rw-r--r--yql/essentials/sql/v1/format/sql_format_ut.cpp23
-rw-r--r--yql/essentials/sql/v1/format/sql_format_ut.h2
-rw-r--r--yql/essentials/sql/v1/format/sql_format_ut_antlr4.cpp23
-rw-r--r--yql/essentials/sql/v1/format/ut/ya.make7
-rw-r--r--yql/essentials/sql/v1/format/ut_antlr4/ya.make8
-rw-r--r--yql/essentials/sql/v1/lexer/lexer_ut.cpp33
-rw-r--r--yql/essentials/sql/v1/lexer/ut/ya.make2
-rw-r--r--yql/essentials/sql/v1/sql.cpp64
-rw-r--r--yql/essentials/sql/v1/sql.h9
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp5
-rw-r--r--yql/essentials/sql/v1/sql_ut.cpp5
-rw-r--r--yql/essentials/sql/v1/sql_ut_antlr4.cpp6
-rw-r--r--yql/essentials/sql/v1/ut/ya.make1
-rw-r--r--yql/essentials/sql/v1/ut_antlr4/ya.make1
-rw-r--r--yql/essentials/tools/sql2yql/sql2yql.cpp12
-rw-r--r--yql/essentials/tools/sql2yql/ya.make4
-rw-r--r--yql/essentials/tools/sql_formatter/sql_formatter.cpp12
-rw-r--r--yql/essentials/tools/sql_formatter/ya.make4
-rw-r--r--yql/essentials/tools/yql_facade_run/ya.make4
-rw-r--r--yql/essentials/tools/yql_facade_run/yql_facade_run.cpp12
-rw-r--r--yql/tools/yqlrun/http/ya.make4
-rw-r--r--yql/tools/yqlrun/http/yql_server.cpp12
36 files changed, 358 insertions, 82 deletions
diff --git a/yql/essentials/parser/lexer_common/ut/hints_ut.cpp b/yql/essentials/parser/lexer_common/ut/hints_ut.cpp
index 0ddce933644..2542c1ac266 100644
--- a/yql/essentials/parser/lexer_common/ut/hints_ut.cpp
+++ b/yql/essentials/parser/lexer_common/ut/hints_ut.cpp
@@ -1,5 +1,6 @@
#include <yql/essentials/parser/lexer_common/hints.h>
#include <yql/essentials/sql/v1/lexer/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
#include <library/cpp/testing/unittest/registar.h>
@@ -8,9 +9,11 @@
using namespace NSQLTranslation;
using namespace NSQLTranslationV1;
-TSQLHints CollectHints(const TString& query, bool antlr4Parser) {
+TSQLHints CollectHints(const TString& query) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
bool ansi = false;
- auto lexer = MakeLexer(ansi, antlr4Parser);
+ auto lexer = MakeLexer(lexers, ansi, true);
UNIT_ASSERT(lexer);
TSQLHints result;
NYql::TIssues issues;
@@ -27,20 +30,7 @@ TString SerializeHints(const TVector<TSQLHint>& hints) {
Y_UNIT_TEST_SUITE(TLexerHintsTests) {
Y_UNIT_TEST(Basic) {
TString query = "/*+ some() */ SELECT /*+ foo(one) */ --+ bar(two)";
- auto hintsWithPos = CollectHints(query, false);
- UNIT_ASSERT(hintsWithPos.size() == 1);
- NYql::TPosition pos = hintsWithPos.begin()->first;
- TVector<TSQLHint> hints = hintsWithPos.begin()->second;
-
- UNIT_ASSERT_EQUAL(pos.Row, 1);
- UNIT_ASSERT_EQUAL(pos.Column, 15);
-
- TStringBuf expected = R"raw("foo":{"one"},"bar":{"two"})raw";
- UNIT_ASSERT_NO_DIFF(SerializeHints(hints), expected);
- }
- Y_UNIT_TEST(Antlr4) {
- TString query = "/*+ some() */ SELECT /*+ foo(one) */ --+ bar(two)";
- auto hintsWithPos = CollectHints(query, true);
+ auto hintsWithPos = CollectHints(query);
UNIT_ASSERT(hintsWithPos.size() == 1);
NYql::TPosition pos = hintsWithPos.begin()->first;
TVector<TSQLHint> hints = hintsWithPos.begin()->second;
diff --git a/yql/essentials/parser/lexer_common/ut/ya.make b/yql/essentials/parser/lexer_common/ut/ya.make
index 564f1a0a44f..ab4a9d96ea9 100644
--- a/yql/essentials/parser/lexer_common/ut/ya.make
+++ b/yql/essentials/parser/lexer_common/ut/ya.make
@@ -2,6 +2,7 @@ UNITTEST_FOR(yql/essentials/parser/lexer_common)
PEERDIR(
yql/essentials/sql/v1/lexer
+ yql/essentials/sql/v1/lexer/antlr4
)
diff --git a/yql/essentials/public/fastcheck/format.cpp b/yql/essentials/public/fastcheck/format.cpp
index d7fbce148c5..570073f5394 100644
--- a/yql/essentials/public/fastcheck/format.cpp
+++ b/yql/essentials/public/fastcheck/format.cpp
@@ -1,5 +1,9 @@
#include "check_runner.h"
#include <yql/essentials/sql/v1/format/sql_format.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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/string/builder.h>
namespace NYql {
@@ -53,7 +57,13 @@ private:
settings.Antlr4Parser = true;
settings.AnsiLexer = request.IsAnsiLexer;
- auto formatter = NSQLFormat::MakeSqlFormatter(settings);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
TString formattedQuery;
res.Success = formatter->Format(request.Program, formattedQuery, res.Issues);
if (res.Success && formattedQuery != request.Program) {
diff --git a/yql/essentials/public/fastcheck/lexer.cpp b/yql/essentials/public/fastcheck/lexer.cpp
index 5d7d4119174..d09a2b79e97 100644
--- a/yql/essentials/public/fastcheck/lexer.cpp
+++ b/yql/essentials/public/fastcheck/lexer.cpp
@@ -1,5 +1,7 @@
#include "check_runner.h"
#include <yql/essentials/sql/v1/lexer/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
#include <yql/essentials/sql/settings/translation_settings.h>
namespace NYql {
@@ -47,7 +49,10 @@ private:
return res;
}
- auto lexer = NSQLTranslationV1::MakeLexer(settings.AnsiLexer, true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, settings.AnsiLexer, true);
auto onNextToken = [&](NSQLTranslation::TParsedToken&& token) {
Y_UNUSED(token);
};
diff --git a/yql/essentials/public/fastcheck/parser.cpp b/yql/essentials/public/fastcheck/parser.cpp
index 3e065be19eb..17fc18ba57e 100644
--- a/yql/essentials/public/fastcheck/parser.cpp
+++ b/yql/essentials/public/fastcheck/parser.cpp
@@ -1,6 +1,10 @@
#include "check_runner.h"
#include <yql/essentials/sql/v1/lexer/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
#include <yql/essentials/sql/v1/proto_parser/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 <yql/essentials/sql/settings/translation_settings.h>
#include <yql/essentials/parser/pg_wrapper/interface/raw_parser.h>
@@ -73,15 +77,21 @@ private:
return res;
}
- auto lexer = NSQLTranslationV1::MakeLexer(settings.AnsiLexer, true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, settings.AnsiLexer, true);
auto onNextToken = [&](NSQLTranslation::TParsedToken&& token) {
Y_UNUSED(token);
};
if (lexer->Tokenize(request.Program, request.File, onNextToken, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS)) {
google::protobuf::Arena arena;
- auto msg = NSQLTranslationV1::SqlAST(request.Program, request.File, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
- settings.AnsiLexer, true, false, &arena);
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto msg = NSQLTranslationV1::SqlAST(parsers, request.Program, request.File, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
+ settings.AnsiLexer, true, &arena);
if (msg) {
res.Success = true;
}
diff --git a/yql/essentials/public/fastcheck/ya.make b/yql/essentials/public/fastcheck/ya.make
index 2423af4ea6d..477b0dcee3e 100644
--- a/yql/essentials/public/fastcheck/ya.make
+++ b/yql/essentials/public/fastcheck/ya.make
@@ -19,7 +19,11 @@ PEERDIR(
yql/essentials/parser/pg_wrapper
yql/essentials/providers/common/provider
yql/essentials/sql/v1/lexer
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
yql/essentials/sql/v1/proto_parser
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
yql/essentials/sql/v1/format
yql/essentials/sql/settings
yql/essentials/parser/pg_wrapper/interface
diff --git a/yql/essentials/public/sql_format/sql_format.cpp b/yql/essentials/public/sql_format/sql_format.cpp
new file mode 100644
index 00000000000..2fe769e5fc7
--- /dev/null
+++ b/yql/essentials/public/sql_format/sql_format.cpp
@@ -0,0 +1,21 @@
+#include "sql_format.h"
+
+#include <yql/essentials/sql/v1/format/sql_format.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
+#include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
+#include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
+
+namespace NSQLFormat {
+
+bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& error) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ return SqlFormatSimple(lexers, parsers, query, formattedQuery, error);
+}
+
+}
diff --git a/yql/essentials/public/sql_format/sql_format.h b/yql/essentials/public/sql_format/sql_format.h
new file mode 100644
index 00000000000..afde5204e69
--- /dev/null
+++ b/yql/essentials/public/sql_format/sql_format.h
@@ -0,0 +1,8 @@
+#pragma once
+#include <util/generic/string.h>
+
+namespace NSQLFormat {
+
+bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& error);
+
+}
diff --git a/yql/essentials/public/sql_format/ya.make b/yql/essentials/public/sql_format/ya.make
new file mode 100644
index 00000000000..d775025e54e
--- /dev/null
+++ b/yql/essentials/public/sql_format/ya.make
@@ -0,0 +1,15 @@
+LIBRARY()
+
+SRCS(
+ sql_format.cpp
+)
+
+PEERDIR(
+ yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
+)
+
+END()
diff --git a/yql/essentials/public/ya.make b/yql/essentials/public/ya.make
index 25709b4555b..cc6bef29309 100644
--- a/yql/essentials/public/ya.make
+++ b/yql/essentials/public/ya.make
@@ -4,6 +4,7 @@ RECURSE(
issue
purecalc
result_format
+ sql_format
types
udf
)
diff --git a/yql/essentials/sql/v1/context.cpp b/yql/essentials/sql/v1/context.cpp
index d28c31469b4..4082757671b 100644
--- a/yql/essentials/sql/v1/context.cpp
+++ b/yql/essentials/sql/v1/context.cpp
@@ -82,10 +82,20 @@ THashMap<TStringBuf, TPragmaMaybeField> CTX_PRAGMA_MAYBE_FIELDS = {
} // namespace
TContext::TContext(const NSQLTranslation::TTranslationSettings& settings,
+ const NSQLTranslation::TSQLHints& hints,
+ NYql::TIssues& issues,
+ const TString& query)
+ : TContext(MakeAllLexers(), MakeAllParsers(), settings, hints, issues, query)
+{}
+
+TContext::TContext(const TLexers& lexers, const TParsers& parsers,
+ const NSQLTranslation::TTranslationSettings& settings,
const NSQLTranslation::TSQLHints& hints,
TIssues& issues,
const TString& query)
- : ClusterMapping(settings.ClusterMapping)
+ : Lexers(lexers)
+ , Parsers(parsers)
+ , ClusterMapping(settings.ClusterMapping)
, PathPrefix(settings.PathPrefix)
, ClusterPathPrefixes(settings.ClusterPathPrefixes)
, SQLHints(hints)
diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h
index c0f45e8fa9b..7c49529a78e 100644
--- a/yql/essentials/sql/v1/context.h
+++ b/yql/essentials/sql/v1/context.h
@@ -92,10 +92,18 @@ namespace NSQLTranslationV1 {
class TContext {
public:
+ //FIXME remove
TContext(const NSQLTranslation::TTranslationSettings& settings,
- const NSQLTranslation::TSQLHints& hints,
- NYql::TIssues& issues,
- const TString& query = {});
+ const NSQLTranslation::TSQLHints& hints,
+ NYql::TIssues& issues,
+ const TString& query = {});
+
+ TContext(const TLexers& lexers,
+ const TParsers& parsers,
+ const NSQLTranslation::TTranslationSettings& settings,
+ const NSQLTranslation::TSQLHints& hints,
+ NYql::TIssues& issues,
+ const TString& query = {});
virtual ~TContext();
@@ -250,6 +258,10 @@ namespace NSQLTranslationV1 {
private:
IOutputStream& MakeIssue(NYql::ESeverity severity, NYql::TIssueCode code, NYql::TPosition pos);
+ public:
+ const TLexers Lexers;
+ const TParsers Parsers;
+
private:
NYql::TPosition Position;
THolder<TStringOutput> IssueMsgHolder;
diff --git a/yql/essentials/sql/v1/format/sql_format.cpp b/yql/essentials/sql/v1/format/sql_format.cpp
index c6a9aa1cb78..cfb6fcde71d 100644
--- a/yql/essentials/sql/v1/format/sql_format.cpp
+++ b/yql/essentials/sql/v1/format/sql_format.cpp
@@ -3,9 +3,6 @@
#include <yql/essentials/parser/lexer_common/lexer.h>
#include <yql/essentials/core/sql_types/simple_types.h>
-#include <yql/essentials/sql/v1/lexer/lexer.h>
-#include <yql/essentials/sql/v1/proto_parser/proto_parser.h>
-
#include <yql/essentials/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h>
#include <library/cpp/protobuf/util/simple_reflection.h>
@@ -3110,8 +3107,12 @@ TStaticData::TStaticData()
class TSqlFormatter : public NSQLFormat::ISqlFormatter {
public:
- TSqlFormatter(const NSQLTranslation::TTranslationSettings& settings)
- : Settings(settings)
+ TSqlFormatter(const NSQLTranslationV1::TLexers& lexers,
+ const NSQLTranslationV1::TParsers& parsers,
+ const NSQLTranslation::TTranslationSettings& settings)
+ : Lexers(lexers)
+ , Parsers(parsers)
+ , Settings(settings)
{}
bool Format(const TString& query, TString& formattedQuery, NYql::TIssues& issues, EFormatMode mode) override {
@@ -3126,7 +3127,7 @@ public:
}
if (mode == EFormatMode::Obfuscate) {
- auto message = NSQLTranslationV1::SqlAST(query, parsedSettings.File, issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser, parsedSettings.TestAntlr4, parsedSettings.Arena);
+ auto message = NSQLTranslationV1::SqlAST(Parsers, query, parsedSettings.File, issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser, parsedSettings.Arena);
if (!message) {
return false;
}
@@ -3135,7 +3136,7 @@ public:
return Format(visitor.Process(*message), formattedQuery, issues, EFormatMode::Pretty);
}
- auto lexer = NSQLTranslationV1::MakeLexer(parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser);
+ auto lexer = NSQLTranslationV1::MakeLexer(Lexers, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser);
TVector<TString> statements;
if (!NSQLTranslationV1::SplitQueryToStatements(query, lexer, statements, issues, parsedSettings.File)) {
return false;
@@ -3161,7 +3162,7 @@ public:
}
NYql::TIssues parserIssues;
- auto message = NSQLTranslationV1::SqlAST(currentQuery, parsedSettings.File, parserIssues, NSQLTranslation::SQL_MAX_PARSER_ERRORS, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser, parsedSettings.TestAntlr4, parsedSettings.Arena);
+ auto message = NSQLTranslationV1::SqlAST(Parsers, currentQuery, parsedSettings.File, parserIssues, NSQLTranslation::SQL_MAX_PARSER_ERRORS, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser, parsedSettings.Arena);
if (!message) {
finalFormattedQuery << currentQuery;
if (!currentQuery.EndsWith("\n")) {
@@ -3209,23 +3210,32 @@ public:
}
private:
+ const NSQLTranslationV1::TLexers Lexers;
+ const NSQLTranslationV1::TParsers Parsers;
const NSQLTranslation::TTranslationSettings Settings;
};
}
+ISqlFormatter::TPtr MakeSqlFormatter(const NSQLTranslationV1::TLexers& lexers,
+ const NSQLTranslationV1::TParsers& parsers,
+ const NSQLTranslation::TTranslationSettings& settings) {
+ return ISqlFormatter::TPtr(new TSqlFormatter(lexers, parsers, settings));
+}
+
ISqlFormatter::TPtr MakeSqlFormatter(const NSQLTranslation::TTranslationSettings& settings) {
- return ISqlFormatter::TPtr(new TSqlFormatter(settings));
+ return MakeSqlFormatter(NSQLTranslationV1::MakeAllLexers(), NSQLTranslationV1::MakeAllParsers(), settings);
}
-TString MutateQuery(const TString& query, const NSQLTranslation::TTranslationSettings& settings) {
+TString MutateQuery(const NSQLTranslationV1::TLexers& lexers,
+ const TString& query, const NSQLTranslation::TTranslationSettings& settings) {
auto parsedSettings = settings;
NYql::TIssues issues;
if (!NSQLTranslation::ParseTranslationSettings(query, parsedSettings, issues)) {
throw yexception() << issues.ToString();
}
- auto lexer = NSQLTranslationV1::MakeLexer(parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser);
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, parsedSettings.AnsiLexer, parsedSettings.Antlr4Parser);
TVector<NSQLTranslation::TParsedToken> allTokens;
auto onNextToken = [&](NSQLTranslation::TParsedToken&& token) {
if (token.Name != "EOF") {
@@ -3248,13 +3258,15 @@ TString MutateQuery(const TString& query, const NSQLTranslation::TTranslationSet
return newQueryBuilder;
}
-bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& error) {
+bool SqlFormatSimple(const NSQLTranslationV1::TLexers& lexers,
+ const NSQLTranslationV1::TParsers& parsers,
+ const TString& query, TString& formattedQuery, TString& error) {
try {
google::protobuf::Arena arena;
NSQLTranslation::TTranslationSettings settings;
settings.Arena = &arena;
- auto formatter = MakeSqlFormatter(settings);
+ auto formatter = MakeSqlFormatter(lexers, parsers, settings);
NYql::TIssues issues;
const bool result = formatter->Format(query, formattedQuery, issues);
if (!result) {
diff --git a/yql/essentials/sql/v1/format/sql_format.h b/yql/essentials/sql/v1/format/sql_format.h
index 6944a730710..3233f2031b8 100644
--- a/yql/essentials/sql/v1/format/sql_format.h
+++ b/yql/essentials/sql/v1/format/sql_format.h
@@ -2,6 +2,8 @@
#include <yql/essentials/public/issue/yql_issue.h>
#include <yql/essentials/sql/settings/translation_settings.h>
+#include <yql/essentials/sql/v1/lexer/lexer.h>
+#include <yql/essentials/sql/v1/proto_parser/proto_parser.h>
#include <util/generic/string.h>
@@ -23,12 +25,18 @@ public:
virtual ~ISqlFormatter() = default;
};
+//FIXME remove
ISqlFormatter::TPtr MakeSqlFormatter(const NSQLTranslation::TTranslationSettings& settings = {});
+ISqlFormatter::TPtr MakeSqlFormatter(const NSQLTranslationV1::TLexers& lexers,
+ const NSQLTranslationV1::TParsers& parsers,
+ const NSQLTranslation::TTranslationSettings& settings = {});
+
// insert spaces and comments between each tokens
-TString MutateQuery(const TString& query, const NSQLTranslation::TTranslationSettings& settings = {});
+TString MutateQuery(const NSQLTranslationV1::TLexers& lexers, const TString& query, const NSQLTranslation::TTranslationSettings& settings = {});
-bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& error);
+bool SqlFormatSimple(const NSQLTranslationV1::TLexers& lexers,
+ const NSQLTranslationV1::TParsers& parsers, const TString& query, TString& formattedQuery, TString& error);
THashSet<TString> GetKeywords();
diff --git a/yql/essentials/sql/v1/format/sql_format_ut.cpp b/yql/essentials/sql/v1/format/sql_format_ut.cpp
index e721f1fae6e..8714ee2d7c9 100644
--- a/yql/essentials/sql/v1/format/sql_format_ut.cpp
+++ b/yql/essentials/sql/v1/format/sql_format_ut.cpp
@@ -1,6 +1,10 @@
#include <library/cpp/testing/unittest/registar.h>
#include "sql_format.h"
+#include <yql/essentials/sql/v1/lexer/antlr3/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr3_ansi/lexer.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 <google/protobuf/arena.h>
#include <util/string/subst.h>
@@ -12,13 +16,25 @@ using TCases = TVector<std::pair<TString, TString>>;
struct TSetup {
TSetup(bool ansiLexer = false) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ lexers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr3 = NSQLTranslationV1::MakeAntlr3ParserFactory();
+ parsers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiParserFactory();
+
NSQLTranslation::TTranslationSettings settings;
+ settings.Antlr4Parser = false;
settings.Arena = &Arena;
settings.AnsiLexer = ansiLexer;
- Formatter = NSQLFormat::MakeSqlFormatter(settings);
+ Formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
}
void Run(const TCases& cases, NSQLFormat::EFormatMode mode = NSQLFormat::EFormatMode::Pretty) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ lexers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiLexerFactory();
+
for (const auto& c : cases) {
NYql::TIssues issues;
TString formatted;
@@ -33,8 +49,11 @@ struct TSetup {
UNIT_ASSERT_C(res2, issues.ToString());
UNIT_ASSERT_NO_DIFF(formatted, formatted2);
+
if (mode == NSQLFormat::EFormatMode::Pretty) {
- auto mutatedQuery = NSQLFormat::MutateQuery(c.first);
+ NSQLTranslation::TTranslationSettings settings;
+ settings.Antlr4Parser = false;
+ auto mutatedQuery = NSQLFormat::MutateQuery(lexers, c.first, settings);
auto res3 = Formatter->Format(mutatedQuery, formatted, issues);
UNIT_ASSERT_C(res3, issues.ToString());
}
diff --git a/yql/essentials/sql/v1/format/sql_format_ut.h b/yql/essentials/sql/v1/format/sql_format_ut.h
index ac4a305d981..d92393008f0 100644
--- a/yql/essentials/sql/v1/format/sql_format_ut.h
+++ b/yql/essentials/sql/v1/format/sql_format_ut.h
@@ -1856,6 +1856,6 @@ Y_UNIT_TEST(ValueConstructor) {
"SELECT\n\tCallable(Callable<(Int32) -> Int32>, ($x) -> ($x))(0)\n;\n"},
};
- TSetup setup(/* ansiLexer = */ true);
+ TSetup setup;
setup.Run(cases);
}
diff --git a/yql/essentials/sql/v1/format/sql_format_ut_antlr4.cpp b/yql/essentials/sql/v1/format/sql_format_ut_antlr4.cpp
index 12e80587eac..9e5be312a7f 100644
--- a/yql/essentials/sql/v1/format/sql_format_ut_antlr4.cpp
+++ b/yql/essentials/sql/v1/format/sql_format_ut_antlr4.cpp
@@ -2,6 +2,12 @@
#include "sql_format.h"
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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 <google/protobuf/arena.h>
#include <util/string/subst.h>
#include <util/string/join.h>
@@ -12,14 +18,25 @@ using TCases = TVector<std::pair<TString, TString>>;
struct TSetup {
TSetup(bool ansiLexer = false) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+
NSQLTranslation::TTranslationSettings settings;
settings.Arena = &Arena;
settings.Antlr4Parser = true;
settings.AnsiLexer = ansiLexer;
- Formatter = NSQLFormat::MakeSqlFormatter(settings);
+ Formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
}
void Run(const TCases& cases, NSQLFormat::EFormatMode mode = NSQLFormat::EFormatMode::Pretty) {
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+
for (const auto& c : cases) {
NYql::TIssues issues;
TString formatted;
@@ -35,7 +52,9 @@ struct TSetup {
UNIT_ASSERT_NO_DIFF(formatted, formatted2);
if (mode == NSQLFormat::EFormatMode::Pretty) {
- auto mutatedQuery = NSQLFormat::MutateQuery(c.first);
+ NSQLTranslation::TTranslationSettings settings;
+ settings.Antlr4Parser = true;
+ auto mutatedQuery = NSQLFormat::MutateQuery(lexers, c.first, settings);
auto res3 = Formatter->Format(mutatedQuery, formatted, issues);
UNIT_ASSERT_C(res3, issues.ToString());
}
diff --git a/yql/essentials/sql/v1/format/ut/ya.make b/yql/essentials/sql/v1/format/ut/ya.make
index 4c3ef65f965..690b13b6180 100644
--- a/yql/essentials/sql/v1/format/ut/ya.make
+++ b/yql/essentials/sql/v1/format/ut/ya.make
@@ -4,4 +4,11 @@ SRCS(
sql_format_ut.cpp
)
+PEERDIR(
+ yql/essentials/sql/v1/lexer/antlr3
+ yql/essentials/sql/v1/lexer/antlr3_ansi
+ yql/essentials/sql/v1/proto_parser/antlr3
+ yql/essentials/sql/v1/proto_parser/antlr3_ansi
+)
+
END()
diff --git a/yql/essentials/sql/v1/format/ut_antlr4/ya.make b/yql/essentials/sql/v1/format/ut_antlr4/ya.make
index a0f9d710a8c..13b0f72a949 100644
--- a/yql/essentials/sql/v1/format/ut_antlr4/ya.make
+++ b/yql/essentials/sql/v1/format/ut_antlr4/ya.make
@@ -4,4 +4,12 @@ SRCS(
sql_format_ut_antlr4.cpp
)
+PEERDIR(
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
+)
+
+
END()
diff --git a/yql/essentials/sql/v1/lexer/lexer_ut.cpp b/yql/essentials/sql/v1/lexer/lexer_ut.cpp
index 7dc84162890..2f0c8bb8e2b 100644
--- a/yql/essentials/sql/v1/lexer/lexer_ut.cpp
+++ b/yql/essentials/sql/v1/lexer/lexer_ut.cpp
@@ -2,6 +2,8 @@
#include <yql/essentials/core/issue/yql_issue.h>
#include <yql/essentials/sql/settings/translation_settings.h>
+#include <yql/essentials/sql/v1/lexer/antlr3/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
#include <library/cpp/testing/unittest/registar.h>
@@ -74,8 +76,12 @@ Y_UNIT_TEST_SUITE(SQLv1Lexer) {
"\"select\"select",
};
- auto lexer3 = MakeLexer(/* ansi = */ false, /* antlr4 = */ false);
- auto lexer4 = MakeLexer(/* ansi = */ false, /* antlr4 = */ true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+
+ auto lexer3 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ false);
+ auto lexer4 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ true);
for (const auto& query : queriesUtf8) {
auto [tokens3, issues3] = Tokenize(lexer3, query);
@@ -89,7 +95,11 @@ Y_UNIT_TEST_SUITE(SQLv1Lexer) {
TVector<TString> InvalidQueries();
void TestInvalidTokensSkipped(bool antlr4, const TVector<TVector<TString>>& expected) {
- auto lexer = MakeLexer(/* ansi = */ false, antlr4);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+
+ auto lexer = MakeLexer(lexers, /* ansi = */ false, antlr4);
auto input = InvalidQueries();
UNIT_ASSERT_VALUES_EQUAL(input.size(), expected.size());
@@ -144,8 +154,12 @@ Y_UNIT_TEST_SUITE(SQLv1Lexer) {
}
Y_UNIT_TEST(IssuesCollected) {
- auto lexer3 = MakeLexer(/* ansi = */ false, /* antlr4 = */ false);
- auto lexer4 = MakeLexer(/* ansi = */ false, /* antlr4 = */ true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+
+ auto lexer3 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ false);
+ auto lexer4 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ true);
for (const auto& query : InvalidQueries()) {
auto issues3 = GetIssueMessages(lexer3, query);
@@ -157,7 +171,9 @@ Y_UNIT_TEST_SUITE(SQLv1Lexer) {
}
Y_UNIT_TEST(IssueMessagesAntlr3) {
- auto lexer3 = MakeLexer(/* ansi = */ false, /* antlr4 = */ false);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ auto lexer3 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ false);
auto actual = GetIssueMessages(lexer3, "\xF0\x9F\x98\x8A SELECT * FR");
@@ -172,7 +188,10 @@ Y_UNIT_TEST_SUITE(SQLv1Lexer) {
}
Y_UNIT_TEST(IssueMessagesAntlr4) {
- auto lexer4 = MakeLexer(/* ansi = */ false, /* antlr4 = */ true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+
+ auto lexer4 = MakeLexer(lexers, /* ansi = */ false, /* antlr4 = */ true);
auto actual = GetIssueMessages(lexer4, "\xF0\x9F\x98\x8A SELECT * FR");
diff --git a/yql/essentials/sql/v1/lexer/ut/ya.make b/yql/essentials/sql/v1/lexer/ut/ya.make
index a05178ada52..70503c127e8 100644
--- a/yql/essentials/sql/v1/lexer/ut/ya.make
+++ b/yql/essentials/sql/v1/lexer/ut/ya.make
@@ -3,6 +3,8 @@ UNITTEST_FOR(yql/essentials/sql/v1/lexer)
PEERDIR(
yql/essentials/core/issue
yql/essentials/parser/lexer_common
+ yql/essentials/sql/v1/lexer/antlr3
+ yql/essentials/sql/v1/lexer/antlr4
)
SRCS(
diff --git a/yql/essentials/sql/v1/sql.cpp b/yql/essentials/sql/v1/sql.cpp
index d8558b21ec7..e4c82a0744f 100644
--- a/yql/essentials/sql/v1/sql.cpp
+++ b/yql/essentials/sql/v1/sql.cpp
@@ -75,35 +75,44 @@ void SqlASTsToYqlsImpl(NYql::TAstParseResult& res, const std::vector<::NSQLv1Gen
}
}
-NYql::TAstParseResult SqlASTToYql(const TString& query,
+NYql::TAstParseResult SqlASTToYql(const TLexers& lexers, const TParsers& parsers,
+ const TString& query,
const google::protobuf::Message& protoAst,
const NSQLTranslation::TSQLHints& hints,
const NSQLTranslation::TTranslationSettings& settings)
{
YQL_ENSURE(IsQueryMode(settings.Mode));
TAstParseResult res;
- TContext ctx(settings, hints, res.Issues, query);
+ TContext ctx(lexers, parsers, settings, hints, res.Issues, query);
SqlASTToYqlImpl(res, protoAst, ctx);
res.ActualSyntaxType = NYql::ESyntaxType::YQLv1;
return res;
}
-NYql::TAstParseResult SqlToYql(const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules)
+NYql::TAstParseResult SqlASTToYql(const TString& query,
+ const google::protobuf::Message& protoAst,
+ const NSQLTranslation::TSQLHints& hints,
+ const NSQLTranslation::TTranslationSettings& settings)
+{
+ return SqlASTToYql(MakeAllLexers(), MakeAllParsers(), query, protoAst, hints, settings);
+}
+
+NYql::TAstParseResult SqlToYql(const TLexers& lexers, const TParsers& parsers, const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules)
{
TAstParseResult res;
const TString queryName = settings.File;
NSQLTranslation::TSQLHints hints;
- auto lexer = MakeLexer(settings.AnsiLexer, settings.Antlr4Parser);
+ auto lexer = MakeLexer(lexers, settings.AnsiLexer, settings.Antlr4Parser);
YQL_ENSURE(lexer);
if (!CollectSqlHints(*lexer, query, queryName, settings.File, hints, res.Issues, settings.MaxErrors, settings.Antlr4Parser)) {
return res;
}
- TContext ctx(settings, hints, res.Issues, query);
+ TContext ctx(lexers, parsers, settings, hints, res.Issues, query);
NSQLTranslation::TErrorCollectorOverIssues collector(res.Issues, settings.MaxErrors, settings.File);
- google::protobuf::Message* ast(SqlAST(query, queryName, collector, settings.AnsiLexer, settings.Antlr4Parser, settings.TestAntlr4, settings.Arena));
+ google::protobuf::Message* ast(SqlAST(parsers, query, queryName, collector, settings.AnsiLexer, settings.Antlr4Parser, settings.Arena));
if (ast) {
SqlASTToYqlImpl(res, *ast, ctx);
} else {
@@ -117,6 +126,10 @@ NYql::TAstParseResult SqlToYql(const TString& query, const NSQLTranslation::TTra
return res;
}
+NYql::TAstParseResult SqlToYql(const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules) {
+ return SqlToYql(MakeAllLexers(), MakeAllParsers(), query, settings, warningRules);
+}
+
bool NeedUseForAllStatements(const TRule_sql_stmt_core::AltCase& subquery) {
switch (subquery) {
case TRule_sql_stmt_core::kAltSqlStmtCore1: // pragma
@@ -187,7 +200,7 @@ bool NeedUseForAllStatements(const TRule_sql_stmt_core::AltCase& subquery) {
}
}
-TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& queryText, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules,
+TVector<NYql::TAstParseResult> SqlToAstStatements(const TLexers& lexers, const TParsers& parsers, const TString& queryText, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules,
TVector<NYql::TStmtParseInfo>* stmtParseInfo)
{
TVector<TAstParseResult> result;
@@ -195,16 +208,16 @@ TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& queryText, cons
TIssues issues;
NSQLTranslation::TSQLHints hints;
- auto lexer = MakeLexer(settings.AnsiLexer, settings.Antlr4Parser);
+ auto lexer = MakeLexer(lexers, settings.AnsiLexer, settings.Antlr4Parser);
YQL_ENSURE(lexer);
if (!CollectSqlHints(*lexer, queryText, queryName, settings.File, hints, issues, settings.MaxErrors, settings.Antlr4Parser)) {
return result;
}
- TContext ctx(settings, hints, issues, queryText);
+ TContext ctx(lexers, parsers, settings, hints, issues, queryText);
NSQLTranslation::TErrorCollectorOverIssues collector(issues, settings.MaxErrors, settings.File);
- google::protobuf::Message* astProto(SqlAST(queryText, queryName, collector, settings.AnsiLexer, settings.Antlr4Parser, settings.TestAntlr4, settings.Arena));
+ google::protobuf::Message* astProto(SqlAST(parsers, queryText, queryName, collector, settings.AnsiLexer, settings.Antlr4Parser, settings.Arena));
if (astProto) {
auto ast = static_cast<const TSQLv1ParserAST&>(*astProto);
const auto& query = ast.GetRule_sql_query();
@@ -215,7 +228,7 @@ TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& queryText, cons
if (NeedUseForAllStatements(statements.GetRule_sql_stmt2().GetRule_sql_stmt_core2().Alt_case())) {
commonStates.push_back(statements.GetRule_sql_stmt2().GetRule_sql_stmt_core2());
} else {
- TContext ctx(settings, hints, issues, queryText);
+ TContext ctx(lexers, parsers, settings, hints, issues, queryText);
result.emplace_back();
if (stmtParseInfo) {
stmtParseInfo->push_back({});
@@ -229,7 +242,7 @@ TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& queryText, cons
commonStates.push_back(block.GetRule_sql_stmt2().GetRule_sql_stmt_core2());
continue;
}
- TContext ctx(settings, hints, issues, queryText);
+ TContext ctx(lexers, parsers, settings, hints, issues, queryText);
result.emplace_back();
if (stmtParseInfo) {
stmtParseInfo->push_back({});
@@ -251,9 +264,13 @@ TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& queryText, cons
return result;
}
-bool SplitQueryToStatements(const TString& query, TVector<TString>& statements, NYql::TIssues& issues,
+TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) {
+ return SqlToAstStatements(MakeAllLexers(), MakeAllParsers(), query, settings, warningRules, stmtParseInfo);
+}
+
+bool SplitQueryToStatements(const TLexers& lexers, const TParsers& parsers, const TString& query, TVector<TString>& statements, NYql::TIssues& issues,
const NSQLTranslation::TTranslationSettings& settings) {
- auto lexer = NSQLTranslationV1::MakeLexer(settings.AnsiLexer, settings.Antlr4Parser);
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, settings.AnsiLexer, settings.Antlr4Parser);
TVector<TString> parts;
if (!SplitQueryToStatements(query, lexer, parts, issues)) {
@@ -262,8 +279,8 @@ bool SplitQueryToStatements(const TString& query, TVector<TString>& statements,
for (auto& currentQuery : parts) {
NYql::TIssues parserIssues;
- auto message = NSQLTranslationV1::SqlAST(currentQuery, settings.File, parserIssues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
- settings.AnsiLexer, settings.Antlr4Parser, settings.TestAntlr4, settings.Arena);
+ auto message = NSQLTranslationV1::SqlAST(parsers, currentQuery, settings.File, parserIssues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
+ settings.AnsiLexer, settings.Antlr4Parser, settings.Arena);
if (!message) {
// Skip empty statements
continue;
@@ -275,13 +292,17 @@ bool SplitQueryToStatements(const TString& query, TVector<TString>& statements,
return true;
}
+bool SplitQueryToStatements(const TString& query, TVector<TString>& statements, NYql::TIssues& issues,
+ const NSQLTranslation::TTranslationSettings& settings) {
+ return SplitQueryToStatements(MakeAllLexers(), MakeAllParsers(), query, statements, issues, settings);
+}
+
class TTranslator : public NSQLTranslation::ITranslator {
public:
TTranslator(const TLexers& lexers, const TParsers& parsers)
: Lexers_(lexers)
, Parsers_(parsers)
{
- Y_UNUSED(Parsers_);
}
NSQLTranslation::ILexer::TPtr MakeLexer(const NSQLTranslation::TTranslationSettings& settings) final {
@@ -291,23 +312,22 @@ public:
NYql::TAstParseResult TextToAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
Y_UNUSED(stmtParseInfo);
- return SqlToYql(query, settings, warningRules);
+ return SqlToYql(Lexers_, Parsers_, query, settings, warningRules);
}
google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
NYql::TIssues& issues, size_t maxErrors, const NSQLTranslation::TTranslationSettings& settings) final {
- return SqlAST(query, queryName, issues, maxErrors, settings.AnsiLexer, settings.Antlr4Parser,
- settings.TestAntlr4, settings.Arena);
+ return SqlAST(Parsers_, query, queryName, issues, maxErrors, settings.AnsiLexer, settings.Antlr4Parser, settings.Arena);
}
NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings) final {
- return SqlASTToYql(query, protoAst, hints, settings);
+ return SqlASTToYql(Lexers_, Parsers_, query, protoAst, hints, settings);
}
TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
- return SqlToAstStatements(query, settings, warningRules, stmtParseInfo);
+ return SqlToAstStatements(Lexers_, Parsers_, query, settings, warningRules, stmtParseInfo);
}
private:
diff --git a/yql/essentials/sql/v1/sql.h b/yql/essentials/sql/v1/sql.h
index b1aaf500012..5ded2321f32 100644
--- a/yql/essentials/sql/v1/sql.h
+++ b/yql/essentials/sql/v1/sql.h
@@ -20,16 +20,25 @@ namespace NSQLTranslation {
namespace NSQLTranslationV1 {
+ //FIXME remove
NYql::TAstParseResult SqlToYql(const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules = nullptr);
+ NYql::TAstParseResult SqlToYql(const TLexers& lexers, const TParsers& parsers, const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules = nullptr);
+ //FIXME remove
NYql::TAstParseResult SqlASTToYql(const TString& query, const google::protobuf::Message& protoAst, const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings);
+ NYql::TAstParseResult SqlASTToYql(const TLexers& lexers, const TParsers& parsers, const TString& query, const google::protobuf::Message& protoAst, const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings);
+ //FIXME remove
TVector<NYql::TAstParseResult> SqlToAstStatements(const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo = nullptr);
+ TVector<NYql::TAstParseResult> SqlToAstStatements(const TLexers& lexers, const TParsers& parsers, const TString& query, const NSQLTranslation::TTranslationSettings& settings, NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo = nullptr);
bool NeedUseForAllStatements(const NSQLv1Generated::TRule_sql_stmt_core::AltCase& subquery);
+ //FIXME remove
bool SplitQueryToStatements(const TString& query, TVector<TString>& statements, NYql::TIssues& issues,
const NSQLTranslation::TTranslationSettings& settings);
+ bool SplitQueryToStatements(const TLexers& lexers, const TParsers& parsers, const TString& query, TVector<TString>& statements, NYql::TIssues& issues,
+ const NSQLTranslation::TTranslationSettings& settings);
NSQLTranslation::TTranslatorPtr MakeTranslator();
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp
index 1c608978869..f4416bb6c5c 100644
--- a/yql/essentials/sql/v1/sql_translation.cpp
+++ b/yql/essentials/sql/v1/sql_translation.cpp
@@ -64,8 +64,9 @@ bool RecreateContext(
const TString queryName = "context recreation query";
const auto* ast = NSQLTranslationV1::SqlAST(
+ ctx.Parsers,
recreationQuery, queryName, ctx.Issues,
- settings.MaxErrors, settings.AnsiLexer, settings.Antlr4Parser, settings.TestAntlr4, settings.Arena
+ settings.MaxErrors, settings.AnsiLexer, settings.Antlr4Parser, settings.Arena
);
if (!ast) {
return false;
@@ -83,7 +84,7 @@ TNodePtr BuildViewSelect(
const TString& contextRecreationQuery
) {
TIssues issues;
- TContext context(parentContext.Settings, {}, issues, parentContext.Query);
+ TContext context(parentContext.Lexers, parentContext.Parsers, parentContext.Settings, {}, issues, parentContext.Query);
if (!RecreateContext(context, context.Settings, contextRecreationQuery)) {
parentContext.Issues.AddIssues(issues);
return nullptr;
diff --git a/yql/essentials/sql/v1/sql_ut.cpp b/yql/essentials/sql/v1/sql_ut.cpp
index bdde5cddab9..e8d1f3527b7 100644
--- a/yql/essentials/sql/v1/sql_ut.cpp
+++ b/yql/essentials/sql/v1/sql_ut.cpp
@@ -5,6 +5,7 @@
#include <yql/essentials/providers/common/provider/yql_provider_names.h>
#include <yql/essentials/sql/sql.h>
#include <yql/essentials/sql/v1/sql.h>
+#include <yql/essentials/sql/v1/lexer/antlr3/lexer.h>
#include <util/generic/map.h>
#include <library/cpp/testing/unittest/registar.h>
@@ -18,7 +19,9 @@ using namespace NSQLTranslation;
namespace {
TParsedTokenList Tokenize(const TString& query) {
- auto lexer = NSQLTranslationV1::MakeLexer(true, false);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, false, false);
TParsedTokenList tokens;
NYql::TIssues issues;
UNIT_ASSERT_C(Tokenize(*lexer, query, "Query", tokens, issues, SQL_MAX_PARSER_ERRORS),
diff --git a/yql/essentials/sql/v1/sql_ut_antlr4.cpp b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
index 2784f85f0b6..a150a7624ba 100644
--- a/yql/essentials/sql/v1/sql_ut_antlr4.cpp
+++ b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
@@ -4,6 +4,7 @@
#include <yql/essentials/providers/common/provider/yql_provider_names.h>
#include <yql/essentials/sql/sql.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
#include <util/generic/map.h>
#include <library/cpp/testing/unittest/registar.h>
@@ -17,7 +18,10 @@ using namespace NSQLTranslation;
namespace {
TParsedTokenList Tokenize(const TString& query) {
- auto lexer = NSQLTranslationV1::MakeLexer(true, true);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+
+ auto lexer = NSQLTranslationV1::MakeLexer(lexers, false, true);
TParsedTokenList tokens;
NYql::TIssues issues;
UNIT_ASSERT_C(Tokenize(*lexer, query, "Query", tokens, issues, SQL_MAX_PARSER_ERRORS),
diff --git a/yql/essentials/sql/v1/ut/ya.make b/yql/essentials/sql/v1/ut/ya.make
index f7dddb9af18..6922d80243e 100644
--- a/yql/essentials/sql/v1/ut/ya.make
+++ b/yql/essentials/sql/v1/ut/ya.make
@@ -12,6 +12,7 @@ PEERDIR(
yql/essentials/sql
yql/essentials/sql/pg_dummy
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr3
)
TIMEOUT(300)
diff --git a/yql/essentials/sql/v1/ut_antlr4/ya.make b/yql/essentials/sql/v1/ut_antlr4/ya.make
index 211ebf7fe2e..427d68f825c 100644
--- a/yql/essentials/sql/v1/ut_antlr4/ya.make
+++ b/yql/essentials/sql/v1/ut_antlr4/ya.make
@@ -12,6 +12,7 @@ PEERDIR(
yql/essentials/sql
yql/essentials/sql/pg_dummy
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
)
TIMEOUT(300)
diff --git a/yql/essentials/tools/sql2yql/sql2yql.cpp b/yql/essentials/tools/sql2yql/sql2yql.cpp
index dea00f68fc7..c7d8f68f55b 100644
--- a/yql/essentials/tools/sql2yql/sql2yql.cpp
+++ b/yql/essentials/tools/sql2yql/sql2yql.cpp
@@ -6,6 +6,10 @@
#include <yql/essentials/sql/sql.h>
#include <yql/essentials/sql/v1/sql.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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 <yql/essentials/providers/common/provider/yql_provider_names.h>
#include <yql/essentials/parser/pg_wrapper/interface/parser.h>
@@ -100,7 +104,13 @@ bool TestFormat(
TString frmQuery;
NYql::TIssues issues;
- auto formatter = NSQLFormat::MakeSqlFormatter(settings);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
if (!formatter->Format(query, frmQuery, issues)) {
Cerr << "Failed to format query: " << issues.ToString() << Endl;
return false;
diff --git a/yql/essentials/tools/sql2yql/ya.make b/yql/essentials/tools/sql2yql/ya.make
index 339169744af..8bd0b01492a 100644
--- a/yql/essentials/tools/sql2yql/ya.make
+++ b/yql/essentials/tools/sql2yql/ya.make
@@ -11,6 +11,10 @@ PEERDIR(
yql/essentials/sql/v1
yql/essentials/sql/pg
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
)
ADDINCL(
diff --git a/yql/essentials/tools/sql_formatter/sql_formatter.cpp b/yql/essentials/tools/sql_formatter/sql_formatter.cpp
index 1cbde29ab39..b5dc06db418 100644
--- a/yql/essentials/tools/sql_formatter/sql_formatter.cpp
+++ b/yql/essentials/tools/sql_formatter/sql_formatter.cpp
@@ -1,4 +1,8 @@
#include <yql/essentials/sql/v1/format/sql_format.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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 <library/cpp/getopt/last_getopt.h>
#include <google/protobuf/arena.h>
@@ -43,7 +47,13 @@ int RunFormat(int argc, char* argv[]) {
NSQLTranslation::TTranslationSettings settings;
settings.Arena = &arena;
settings.AnsiLexer = res.Has("ansi-lexer");
- auto formatter = NSQLFormat::MakeSqlFormatter(settings);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
TString frm_query;
TString error;
NYql::TIssues issues;
diff --git a/yql/essentials/tools/sql_formatter/ya.make b/yql/essentials/tools/sql_formatter/ya.make
index 082bf605ceb..a198f772c9b 100644
--- a/yql/essentials/tools/sql_formatter/ya.make
+++ b/yql/essentials/tools/sql_formatter/ya.make
@@ -4,6 +4,10 @@ PEERDIR(
library/cpp/getopt
contrib/libs/protobuf
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
)
SRCS(
diff --git a/yql/essentials/tools/yql_facade_run/ya.make b/yql/essentials/tools/yql_facade_run/ya.make
index f434c449fb9..d08df659479 100644
--- a/yql/essentials/tools/yql_facade_run/ya.make
+++ b/yql/essentials/tools/yql_facade_run/ya.make
@@ -37,6 +37,10 @@ PEERDIR(
yql/essentials/protos
yql/essentials/sql/settings
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
yql/essentials/sql/v1
yql/essentials/sql
diff --git a/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp b/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
index ac09dda5002..ba0a10c3119 100644
--- a/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
+++ b/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
@@ -42,6 +42,10 @@
#include <yql/essentials/sql/v1/format/sql_format.h>
#include <yql/essentials/sql/v1/sql.h>
#include <yql/essentials/sql/sql.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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 <library/cpp/resource/resource.h>
#include <library/cpp/yson/node/node_io.h>
@@ -706,7 +710,13 @@ int TFacadeRunner::DoRun(TProgramFactory& factory) {
if (!fail && RunOptions_.TestSqlFormat && 1 == RunOptions_.SyntaxVersion) {
TString formattedProgramText;
NYql::TIssues issues;
- auto formatter = NSQLFormat::MakeSqlFormatter(settings);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
if (!formatter->Format(RunOptions_.ProgramText, formattedProgramText, issues)) {
*RunOptions_.ErrStream << "Format failed" << Endl;
issues.PrintTo(*RunOptions_.ErrStream);
diff --git a/yql/tools/yqlrun/http/ya.make b/yql/tools/yqlrun/http/ya.make
index 34dafb3fae0..d9e85ed88e2 100644
--- a/yql/tools/yqlrun/http/ya.make
+++ b/yql/tools/yqlrun/http/ya.make
@@ -34,6 +34,10 @@ PEERDIR(
yql/essentials/minikql/comp_nodes
yql/essentials/parser/pg_wrapper/interface
yql/essentials/sql/v1/format
+ yql/essentials/sql/v1/lexer/antlr4
+ yql/essentials/sql/v1/lexer/antlr4_ansi
+ yql/essentials/sql/v1/proto_parser/antlr4
+ yql/essentials/sql/v1/proto_parser/antlr4_ansi
yql/essentials/utils/log
yql/essentials/utils
diff --git a/yql/tools/yqlrun/http/yql_server.cpp b/yql/tools/yqlrun/http/yql_server.cpp
index d6bf8382791..6467eee80f1 100644
--- a/yql/tools/yqlrun/http/yql_server.cpp
+++ b/yql/tools/yqlrun/http/yql_server.cpp
@@ -14,6 +14,10 @@
#include <yql/essentials/minikql/comp_nodes/mkql_factories.h>
#include <yql/essentials/parser/pg_wrapper/interface/comp_factory.h>
#include <yql/essentials/sql/v1/format/sql_format.h>
+#include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
+#include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.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 <yql/essentials/utils/log/log.h>
#include <yql/essentials/utils/log/tls_backend.h>
@@ -294,7 +298,13 @@ YQL_ACTION(Format)
google::protobuf::Arena arena;
NSQLTranslation::TTranslationSettings settings;
settings.Arena = &arena;
- auto formatter = NSQLFormat::MakeSqlFormatter(settings);
+ NSQLTranslationV1::TLexers lexers;
+ lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
+ lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
+ NSQLTranslationV1::TParsers parsers;
+ parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
+ auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
TString frm_query;
TString error;
NYql::TIssues issues;