#include "check_complete.h" #include #include #include #include #include #include #include #include #include #include #include #include namespace NSQLComplete { namespace { TLexerSupplier MakePureLexerSupplier() { NSQLTranslationV1::TLexers lexers; lexers.Antlr4Pure = NSQLTranslationV1::MakeAntlr4PureLexerFactory(); lexers.Antlr4PureAnsi = NSQLTranslationV1::MakeAntlr4PureAnsiLexerFactory(); return [lexers = std::move(lexers)](bool ansi) { return NSQLTranslationV1::MakeLexer( lexers, ansi, NSQLTranslationV1::ELexerFlavor::Pure); }; } INameService::TPtr MakeClusterNameService(const TYqlContext& ctx) { THashSet clusterSet = ctx.Clusters(); TVector clusterVec(begin(clusterSet), end(clusterSet)); Sort(clusterVec); return MakeClusterNameService(MakeStaticClusterDiscovery(std::move(clusterVec))); } INameService::TPtr MakeSchemaNameService(const TYqlContext& ctx) { THashMap>> fs; for (const auto& [cluster, tables] : ctx.TablesByCluster) { for (TString table : tables) { fs[cluster]["/"].push_back(TFolderEntry{ .Type = TFolderEntry::Table, .Name = std::move(table), }); } } return MakeSchemaNameService(MakeSimpleSchema(MakeStaticSimpleSchema({.Folders = std::move(fs)}))); } } // namespace bool CheckComplete(TStringBuf query, TYqlContext ctx) { constexpr size_t Seed = 97651231; constexpr size_t Attempts = 64; constexpr size_t MaxAttempts = 256; SetRandomSeed(Seed); auto service = MakeUnionNameService( { MakeClusterNameService(ctx), MakeSchemaNameService(ctx), }, MakeDefaultRanking()); auto engine = MakeSqlCompletionEngine( MakePureLexerSupplier(), std::move(service), MakeYQLConfiguration()); for (size_t i = 0, j = 0; i < Attempts && j < MaxAttempts; ++j) { size_t pos = RandomNumber(query.size() + 1); if (pos < query.size() && IsUTF8ContinuationByte(query.at(pos))) { continue; } TCompletionInput input = { .Text = query, .CursorPosition = pos, }; auto output = engine->Complete(input).ExtractValueSync(); Y_DO_NOT_OPTIMIZE_AWAY(output); i += 1; } return true; } bool CheckComplete(TStringBuf query, NYql::TExprNode::TPtr root, NYql::TExprContext& ctx, NYql::TIssues& issues) try { return CheckComplete(query, MakeYqlAnalysis()->Analyze(root, ctx)); } catch (...) { issues.AddIssue(FormatCurrentException()); return false; } bool CheckComplete(TStringBuf query, NYql::TAstNode& root, NYql::TIssues& issues) try { return CheckComplete(query, MakeYqlAnalysis()->Analyze(root, issues).GetOrElse({})); } catch (...) { issues.AddIssue(FormatCurrentException()); return false; } } // namespace NSQLComplete