123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #include "fastcheck.h"
- #include <yql/essentials/ast/yql_ast.h>
- #include <yql/essentials/ast/yql_expr.h>
- #include <yql/essentials/core/services/mounts/yql_mounts.h>
- #include <yql/essentials/core/user_data/yql_user_data.h>
- #include <yql/essentials/core/yql_type_annotation.h>
- #include <yql/essentials/core/yql_user_data_storage.h>
- #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/parser/pg_wrapper/interface/parser.h>
- namespace NYql {
- namespace NFastCheck {
- bool CheckProgram(const TString& program, const TOptions& options, TIssues& errors) {
- NSQLTranslationV1::TLexers lexers;
- lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
- lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
- NSQLTranslationV1::TParsers parsers;
- parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
- parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
- NSQLTranslation::TTranslators translators(
- nullptr,
- NSQLTranslationV1::MakeTranslator(lexers, parsers),
- NSQLTranslationPG::MakeTranslator()
- );
- TAstParseResult astRes;
- if (options.IsSql) {
- NSQLTranslation::TTranslationSettings settings;
- settings.ClusterMapping = options.ClusterMapping;
- settings.SyntaxVersion = options.SyntaxVersion;
- settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
- settings.EmitReadsForExists = true;
- if (options.IsLibrary) {
- settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
- }
- astRes = SqlToYql(translators, program, settings);
- } else {
- astRes = ParseAst(program);
- }
- if (!astRes.IsOk()) {
- errors = std::move(astRes.Issues);
- return false;
- }
- if (options.IsLibrary) {
- return true;
- }
- if (options.ParseOnly) {
- // parse SQL libs
- for (const auto& x : options.SqlLibs) {
- NSQLTranslation::TTranslationSettings settings;
- settings.ClusterMapping = options.ClusterMapping;
- settings.SyntaxVersion = options.SyntaxVersion;
- settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
- settings.File = x.first;
- settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
- astRes = SqlToYql(translators, x.second, settings);
- if (!astRes.IsOk()) {
- errors = std::move(astRes.Issues);
- return false;
- }
- }
- return true;
- }
- TVector<NUserData::TUserData> userData;
- for (const auto& x : options.SqlLibs) {
- NUserData::TUserData data;
- data.Type_ = NUserData::EType::LIBRARY;
- data.Disposition_ = NUserData::EDisposition::INLINE;
- data.Name_ = x.first;
- data.Content_ = x.second;
- userData.push_back(data);
- }
- TExprContext libCtx;
- libCtx.IssueManager.AddIssues(std::move(astRes.Issues));
- IModuleResolver::TPtr moduleResolver;
- TUserDataTable userDataTable = GetYqlModuleResolver(libCtx, moduleResolver, userData, options.ClusterMapping, {});
- if (!userDataTable) {
- errors = libCtx.IssueManager.GetIssues();
- libCtx.IssueManager.Reset();
- return false;
- }
- auto userDataStorage = MakeIntrusive<TUserDataStorage>(nullptr, userDataTable, nullptr, nullptr);
- if (auto modules = dynamic_cast<TModuleResolver*>(moduleResolver.get())) {
- modules->AttachUserData(userDataStorage);
- }
- TExprContext exprCtx(libCtx.NextUniqueId);
- TExprNode::TPtr exprRoot;
- if (!CompileExpr(*astRes.Root, exprRoot, exprCtx, moduleResolver.get(), nullptr, false, Max<ui32>(), options.SyntaxVersion)) {
- errors = exprCtx.IssueManager.GetIssues();
- exprCtx.IssueManager.Reset();
- return false;
- }
- return true;
- }
- }
- }
|