#pragma once #include "node.h" #include "sql.h" #include #include #include #include #include #include #include #include #include #include #include namespace NSQLTranslationV0 { typedef TMap TNamedNodesMap; class TContext { public: TContext(const NSQLTranslation::TTranslationSettings& settings, NYql::TIssues& issues); virtual ~TContext(); const NYql::TPosition& Pos() const; void ClearBlockScope(); TString MakeName(const TString& name); IOutputStream& Error(); IOutputStream& Error(NYql::TPosition pos); IOutputStream& Warning(NYql::TPosition pos, NYql::TIssueCode code); IOutputStream& Info(NYql::TPosition pos); template const TString& Token(const TToken& token) { Position.Row = token.GetLine(); Position.Column = token.GetColumn() + 1; return token.GetValue(); } template TPosition TokenPosition(const TToken& token) { TPosition pos = Position; pos.Row = token.GetLine(); pos.Column = token.GetColumn() + 1; return pos; } inline void IncrementMonCounter(const TString& name, const TString& value) { if (IncrementMonCounterFunction) { IncrementMonCounterFunction(name, value); } } bool HasCluster(const TString& cluster) const { return GetClusterProvider(cluster).Defined(); } TMaybe GetClusterProvider(const TString& cluster) const { TString unusedNormalizedClusterName; return GetClusterProvider(cluster, unusedNormalizedClusterName); } TMaybe GetClusterProvider(const TString& cluster, TString& normalizedClusterName) const { auto provider = ClusterMapping.GetClusterProvider(cluster, normalizedClusterName); if (!provider) { if (Settings.AssumeYdbOnClusterWithSlash && cluster.StartsWith('/')) { normalizedClusterName = cluster; return TString(NYql::KikimrProviderName); } return Nothing(); } return provider; } TString GetServiceName(const ISource& source) const; bool UseUnordered(const ISource& source) const; bool UseUnordered(const TTableRef& table) const; bool SetPathPrefix(const TString& value, TMaybe arg = TMaybe()); TNodePtr GetPrefixedPath(const TString& cluster, const TDeferredAtom& path); TNodePtr UniversalAlias(const TString& baseName, TNodePtr&& node); TString HasBlockShortcut(const TNodePtr& baseNode); TString RegisterBlockShortcut(const TNodePtr& baseNode, const TNodePtr& node, const TString& baseName); TNodePtr GetBlockShortcut(const TString& alias) const; TNodePtr GroundBlockShortcuts(NYql::TPosition pos, TNodePtr groundList = {}); TNodePtr GroundBlockShortcutsForExpr(const TNodePtr& expr); void PushBlockShortcuts(); void PopBlockShortcuts(); void BodyPart() { IntoHeading = false; } bool IsParseHeading() const { return IntoHeading; } bool DeclareVariable(const TString& varName, const TNodePtr& typeNode); bool AddExports(const TVector& symbols); TString AddImport(const TVector& modulePath); TString AddSimpleUdf(const TString& udf); private: IOutputStream& MakeIssue(NYql::ESeverity severity, NYql::TIssueCode code, NYql::TPosition pos); private: NYql::TPosition Position; THolder IssueMsgHolder; NSQLTranslation::TClusterMapping ClusterMapping; TString PathPrefix; THashMap ProviderPathPrefixes; THashMap ClusterPathPrefixes; bool IntoHeading = true; public: THashMap Variables; NSQLTranslation::TTranslationSettings Settings; std::unique_ptr Pool; NYql::TIssues& Issues; TMap> NamedNodes; TMap UniversalAliases; THashSet Exports; THashMap ImportModuleAliases; TMap SimpleUdfs; NSQLTranslation::TIncrementMonCounterFunction IncrementMonCounterFunction; TString CurrCluster; bool HasPendingErrors; THashMap GenIndexes; bool PragmaRefSelect = false; bool PragmaSampleSelect = false; bool PragmaAllowDotInAlias = false; bool PragmaInferSchema = false; bool PragmaAutoCommit = false; bool SimpleColumns = false; bool PragmaDirectRead = false; bool PragmaYsonAutoConvert = false; bool PragmaYsonStrict = false; bool PragmaClassicDivision = true; bool PragmaPullUpFlatMapOverJoin = true; bool EnableSystemColumns = true; ui32 ResultRowsLimit = 0; ui64 ResultSizeLimit = 0; ui32 PragmaGroupByLimit = 1 << 6; ui32 PragmaGroupByCubeLimit = 5; THashSet Libraries; NYql::TWarningPolicy WarningPolicy; TVector AllResults; TSet UsedClusters; struct ShortcutStore { THashMap BaseMap; TVector> Goal; }; THashMap Shortcuts; ui32 ShortcutCurrentLevel = 0; }; class TTranslation { protected: typedef TSet TSetType; protected: TTranslation(TContext& ctx); public: TContext& Context(); IOutputStream& Error(); template const TString& Token(const TToken& token) { return Ctx.Token(token); } template TString Identifier(const TToken& token) { return IdContent(Ctx, Token(token)); } TString Identifier(const TString& str) const { return IdContent(Ctx, str); } TNodePtr GetNamedNode(const TString& name); void PushNamedNode(const TString& name, TNodePtr node); void PopNamedNode(const TString& name); template void AltNotImplemented(const TString& ruleName, const TNode& node) { AltNotImplemented(ruleName, node.Alt_case(), node, TNode::descriptor()); } template TString AltDescription(const TNode& node) const { return AltDescription(node, node.Alt_case(), TNode::descriptor()); } protected: void AltNotImplemented(const TString& ruleName, ui32 altCase, const google::protobuf::Message& node, const google::protobuf::Descriptor* descr); TString AltDescription(const google::protobuf::Message& node, ui32 altCase, const google::protobuf::Descriptor* descr) const; protected: TContext& Ctx; }; } // namespace NSQLTranslationV0