yql_provider.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #pragma once
  2. #include <yql/essentials/ast/yql_expr.h>
  3. #include <yql/essentials/core/yql_data_provider.h>
  4. #include <yql/essentials/core/yql_graph_transformer.h>
  5. #include <yql/essentials/core/yql_expr_optimize.h>
  6. #include <yql/essentials/core/yql_expr_type_annotation.h>
  7. #include <yql/essentials/core/expr_nodes/yql_expr_nodes.h>
  8. #include <library/cpp/yson/writer.h>
  9. #include <util/generic/hash_set.h>
  10. #include <util/generic/string.h>
  11. #include <util/generic/strbuf.h>
  12. #include <utility>
  13. namespace NYson {
  14. class TYsonWriter;
  15. }
  16. namespace NKikimr {
  17. namespace NMiniKQL {
  18. class IFunctionRegistry;
  19. }
  20. }
  21. namespace NYql {
  22. struct TTypeAnnotationContext;
  23. struct TOperationStatistics;
  24. namespace NCommon {
  25. constexpr TStringBuf PgCatalogFileName = "_yql_pg_catalog";
  26. struct TWriteTableSettings {
  27. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  28. NNodes::TMaybeNode<NNodes::TCoAtom> Temporary;
  29. NNodes::TMaybeNode<NNodes::TCoAtom> IsBatch;
  30. NNodes::TMaybeNode<NNodes::TExprList> Columns;
  31. NNodes::TMaybeNode<NNodes::TExprList> ReturningList;
  32. NNodes::TMaybeNode<NNodes::TCoAtomList> PrimaryKey;
  33. NNodes::TMaybeNode<NNodes::TCoAtomList> PartitionBy;
  34. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> OrderBy;
  35. NNodes::TMaybeNode<NNodes::TCoLambda> Filter;
  36. NNodes::TMaybeNode<NNodes::TCoLambda> Update;
  37. NNodes::TMaybeNode<NNodes::TCoIndexList> Indexes;
  38. NNodes::TMaybeNode<NNodes::TCoChangefeedList> Changefeeds;
  39. NNodes::TCoNameValueTupleList Other;
  40. NNodes::TMaybeNode<NNodes::TExprList> ColumnFamilies;
  41. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> ColumnsDefaultValues;
  42. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> TableSettings;
  43. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> AlterActions;
  44. NNodes::TMaybeNode<NNodes::TCoAtom> TableType;
  45. NNodes::TMaybeNode<NNodes::TCallable> PgFilter;
  46. TWriteTableSettings(const NNodes::TCoNameValueTupleList& other)
  47. : Other(other) {}
  48. };
  49. struct TWriteSequenceSettings {
  50. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  51. NNodes::TMaybeNode<NNodes::TCoAtom> ValueType;
  52. NNodes::TMaybeNode<NNodes::TCoAtom> Temporary;
  53. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> SequenceSettings;
  54. NNodes::TCoNameValueTupleList Other;
  55. TWriteSequenceSettings(const NNodes::TCoNameValueTupleList& other)
  56. : Other(other) {}
  57. };
  58. struct TWriteTopicSettings {
  59. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  60. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> TopicSettings;
  61. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> Consumers;
  62. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> AddConsumers;
  63. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> AlterConsumers;
  64. NNodes::TMaybeNode<NNodes::TCoAtomList> DropConsumers;
  65. NNodes::TCoNameValueTupleList Other;
  66. TWriteTopicSettings(const NNodes::TCoNameValueTupleList& other)
  67. : Other(other)
  68. {}
  69. };
  70. struct TWriteReplicationSettings {
  71. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  72. NNodes::TMaybeNode<NNodes::TCoReplicationTargetList> Targets;
  73. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> ReplicationSettings;
  74. NNodes::TCoNameValueTupleList Other;
  75. TWriteReplicationSettings(const NNodes::TCoNameValueTupleList& other)
  76. : Other(other)
  77. {}
  78. };
  79. struct TWriteTransferSettings {
  80. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  81. NNodes::TMaybeNode<NNodes::TCoAtom> Source;
  82. NNodes::TMaybeNode<NNodes::TCoAtom> Target;
  83. NNodes::TMaybeNode<NNodes::TCoAtom> TransformLambda;
  84. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> TransferSettings;
  85. NNodes::TCoNameValueTupleList Other;
  86. TWriteTransferSettings(const NNodes::TCoNameValueTupleList& other)
  87. : Other(other)
  88. {}
  89. };
  90. struct TWriteRoleSettings {
  91. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  92. NNodes::TMaybeNode<NNodes::TCoAtomList> Roles;
  93. NNodes::TMaybeNode<NNodes::TCoAtom> NewName;
  94. NNodes::TCoNameValueTupleList Other;
  95. TWriteRoleSettings(const NNodes::TCoNameValueTupleList& other)
  96. : Other(other) {}
  97. };
  98. struct TWritePermissionSettings {
  99. NNodes::TMaybeNode<NNodes::TCoAtomList> Permissions;
  100. NNodes::TMaybeNode<NNodes::TCoAtomList> Paths;
  101. NNodes::TMaybeNode<NNodes::TCoAtomList> RoleNames;
  102. TWritePermissionSettings(NNodes::TMaybeNode<NNodes::TCoAtomList>&& permissions, NNodes::TMaybeNode<NNodes::TCoAtomList>&& paths, NNodes::TMaybeNode<NNodes::TCoAtomList>&& roleNames)
  103. : Permissions(std::move(permissions))
  104. , Paths(std::move(paths))
  105. , RoleNames(std::move(roleNames)) {}
  106. };
  107. struct TWriteObjectSettings {
  108. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  109. NNodes::TCoNameValueTupleList Features;
  110. NNodes::TCoAtomList ResetFeatures;
  111. TWriteObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TCoNameValueTupleList&& kvFeatures, NNodes::TCoAtomList&& resetFeatures)
  112. : Mode(std::move(mode))
  113. , Features(std::move(kvFeatures))
  114. , ResetFeatures(std::move(resetFeatures))
  115. {
  116. }
  117. };
  118. struct TCommitSettings
  119. {
  120. TPositionHandle Pos;
  121. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  122. NNodes::TMaybeNode<NNodes::TCoAtom> Epoch;
  123. NNodes::TCoNameValueTupleList Other;
  124. TCommitSettings(NNodes::TCoNameValueTupleList other)
  125. : Other(other) {}
  126. NNodes::TCoNameValueTupleList BuildNode(TExprContext& ctx) const;
  127. bool EnsureModeEmpty(TExprContext& ctx);
  128. bool EnsureEpochEmpty(TExprContext& ctx);
  129. bool EnsureOtherEmpty(TExprContext& ctx);
  130. };
  131. struct TPgObjectSettings
  132. {
  133. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  134. NNodes::TMaybeNode<NNodes::TCoAtom> IfExists;
  135. TPgObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TMaybeNode<NNodes::TCoAtom>&& ifExists)
  136. : Mode(std::move(mode))
  137. , IfExists(std::move(ifExists)) {}
  138. };
  139. const TStructExprType* BuildCommonTableListType(TExprContext& ctx);
  140. TExprNode::TPtr BuildTypeExpr(TPositionHandle pos, const TTypeAnnotationNode& ann, TExprContext& ctx);
  141. bool HasResOrPullOption(const TExprNode& node, const TStringBuf& option);
  142. TVector<TString> GetResOrPullColumnHints(const TExprNode& node);
  143. TWriteTableSettings ParseWriteTableSettings(NNodes::TExprList node, TExprContext& ctx);
  144. TWriteTopicSettings ParseWriteTopicSettings(NNodes::TExprList node, TExprContext& ctx);
  145. TWriteReplicationSettings ParseWriteReplicationSettings(NNodes::TExprList node, TExprContext& ctx);
  146. TWriteTransferSettings ParseWriteTransferSettings(NNodes::TExprList node, TExprContext& ctx);
  147. TWriteRoleSettings ParseWriteRoleSettings(NNodes::TExprList node, TExprContext& ctx);
  148. TWriteObjectSettings ParseWriteObjectSettings(NNodes::TExprList node, TExprContext& ctx);
  149. TWritePermissionSettings ParseWritePermissionsSettings(NNodes::TExprList node, TExprContext& ctx);
  150. TCommitSettings ParseCommitSettings(NNodes::TCoCommit node, TExprContext& ctx);
  151. TPgObjectSettings ParsePgObjectSettings(NNodes::TExprList node, TExprContext& ctx);
  152. TWriteSequenceSettings ParseSequenceSettings(NNodes::TExprList node, TExprContext& ctx);
  153. TString FullTableName(const TStringBuf& cluster, const TStringBuf& table);
  154. IDataProvider::TFillSettings GetFillSettings(const TExprNode& node);
  155. NYson::EYsonFormat GetYsonFormat(const IDataProvider::TFillSettings& fillSettings);
  156. TVector<TString> GetStructFields(const TTypeAnnotationNode* type);
  157. void TransformerStatsToYson(const TString& name, const IGraphTransformer::TStatistics& stats, NYson::TYsonWriter& writer);
  158. TString TransformerStatsToYson(const IGraphTransformer::TStatistics& stats, NYson::EYsonFormat format
  159. = NYson::EYsonFormat::Pretty);
  160. void FillSecureParams(const TExprNode::TPtr& node, const TTypeAnnotationContext& types, THashMap<TString, TString>& secureParams);
  161. bool FillUsedFiles(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const TUserDataTable& crutches = {});
  162. std::pair<IGraphTransformer::TStatus, TAsyncTransformCallbackFuture> FreezeUsedFiles(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const std::function<bool(const TString&)>& urlDownloadFilter, const TUserDataTable& crutches = {});
  163. bool FreezeUsedFilesSync(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const std::function<bool(const TString&)>& urlDownloadFilter);
  164. void WriteColumns(NYson::TYsonWriter& writer, const NNodes::TExprBase& columns);
  165. TString SerializeExpr(TExprContext& ctx, const TExprNode& expr, bool withTypes = false);
  166. TString ExprToPrettyString(TExprContext& ctx, const TExprNode& expr);
  167. void WriteStream(NYson::TYsonWriter& writer, const TExprNode* node, const TExprNode* source);
  168. void WriteStreams(NYson::TYsonWriter& writer, TStringBuf name, const NNodes::TCoLambda& lambda);
  169. double GetDataReplicationFactor(const TExprNode& lambda, TExprContext& ctx);
  170. void WriteStatistics(NYson::TYsonWriter& writer, bool totalOnly, const THashMap<ui32, TOperationStatistics>& statistics, bool addTotalKey = true, bool addExternalMap = true);
  171. void WriteStatistics(NYson::TYsonWriter& writer, const TOperationStatistics& statistics);
  172. bool ValidateCompressionForInput(std::string_view format, std::string_view compression, TExprContext& ctx);
  173. bool ValidateCompressionForOutput(std::string_view format, std::string_view compression, TExprContext& ctx);
  174. bool ValidateFormatForInput(std::string_view format, const TStructExprType* schemaStructRowType, const std::function<bool(TStringBuf)>& excludeFields, TExprContext& ctx);
  175. bool ValidateFormatForOutput(std::string_view format, TExprContext& ctx);
  176. bool ValidateIntervalUnit(std::string_view unit, TExprContext& ctx);
  177. bool ValidateDateTimeFormatName(std::string_view formatName, TExprContext& ctx);
  178. bool ValidateTimestampFormatName(std::string_view formatName, TExprContext& ctx);
  179. bool TransformPgSetItemOption(
  180. const NNodes::TCoPgSelect& pgSelect,
  181. TStringBuf optionName,
  182. std::function<void(const NNodes::TExprBase&)> lambda
  183. );
  184. TExprNode::TPtr GetSetItemOption(const NNodes::TCoPgSelect& pgSelect, TStringBuf optionName);
  185. TExprNode::TPtr GetSetItemOptionValue(const NNodes::TExprBase& setItemOption);
  186. bool NeedToRenamePgSelectColumns(const NNodes::TCoPgSelect& pgSelect);
  187. bool RenamePgSelectColumns(
  188. const NNodes::TCoPgSelect& node,
  189. TExprNode::TPtr& output,
  190. const TMaybe<TColumnOrder>& tableColumnOrder,
  191. TExprContext& ctx,
  192. TTypeAnnotationContext& types);
  193. } // namespace NCommon
  194. } // namespace NYql