node.h 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602
  1. #pragma once
  2. #include <google/protobuf/message.h>
  3. #include <yql/essentials/utils/resetable_setting.h>
  4. #include <yql/essentials/parser/proto_ast/common.h>
  5. #include <yql/essentials/public/udf/udf_data_type.h>
  6. #include <yql/essentials/ast/yql_ast.h>
  7. #include <yql/essentials/ast/yql_expr.h>
  8. #include <util/generic/vector.h>
  9. #include <util/generic/set.h>
  10. #include <util/generic/map.h>
  11. #include <util/generic/hash.h>
  12. #include <util/generic/hash_set.h>
  13. #include <util/generic/maybe.h>
  14. #include <util/string/builder.h>
  15. #include <library/cpp/enumbitset/enumbitset.h>
  16. #include <array>
  17. #include <functional>
  18. #include <variant>
  19. namespace NSQLTranslationV1 {
  20. constexpr const size_t SQL_MAX_INLINE_SCRIPT_LEN = 24;
  21. using NYql::TPosition;
  22. using NYql::TAstNode;
  23. enum class ENodeState {
  24. Begin,
  25. Precached = Begin,
  26. Initialized,
  27. CountHint,
  28. Const,
  29. MaybeConst,
  30. Aggregated,
  31. AggregationKey,
  32. OverWindow,
  33. OverWindowDistinct,
  34. Failed,
  35. End,
  36. };
  37. typedef TEnumBitSet<ENodeState, static_cast<int>(ENodeState::Begin), static_cast<int>(ENodeState::End)> TNodeState;
  38. enum class ESQLWriteColumnMode {
  39. InsertInto,
  40. InsertOrAbortInto,
  41. InsertOrIgnoreInto,
  42. InsertOrRevertInto,
  43. UpsertInto,
  44. ReplaceInto,
  45. InsertIntoWithTruncate,
  46. Update,
  47. Delete,
  48. };
  49. enum class EWriteColumnMode {
  50. Default,
  51. Insert,
  52. InsertOrAbort,
  53. InsertOrIgnore,
  54. InsertOrRevert,
  55. Upsert,
  56. Replace,
  57. Renew,
  58. Update,
  59. UpdateOn,
  60. Delete,
  61. DeleteOn,
  62. };
  63. enum class EAlterTableIntentnt {
  64. AddColumn,
  65. DropColumn
  66. };
  67. enum class ETableType {
  68. Table,
  69. TableStore,
  70. ExternalTable
  71. };
  72. class TContext;
  73. class ITableKeys;
  74. class ISource;
  75. class IAggregation;
  76. class TObjectOperatorContext;
  77. typedef TIntrusivePtr<IAggregation> TAggregationPtr;
  78. class TColumnNode;
  79. class TTupleNode;
  80. class TCallNode;
  81. class TStructNode;
  82. class TAccessNode;
  83. class TLambdaNode;
  84. class TUdfNode;
  85. typedef TIntrusivePtr<ISource> TSourcePtr;
  86. struct TScopedState;
  87. typedef TIntrusivePtr<TScopedState> TScopedStatePtr;
  88. inline TString DotJoin(const TString& lhs, const TString& rhs) {
  89. TStringBuilder sb;
  90. sb << lhs << "." << rhs;
  91. return sb;
  92. }
  93. TString ErrorDistinctByGroupKey(const TString& column);
  94. TString ErrorDistinctWithoutCorrelation(const TString& column);
  95. class INode: public TSimpleRefCount<INode> {
  96. public:
  97. typedef TIntrusivePtr<INode> TPtr;
  98. struct TIdPart {
  99. TString Name;
  100. TPtr Expr;
  101. TIdPart(const TString& name)
  102. : Name(name)
  103. {
  104. }
  105. TIdPart(TPtr expr)
  106. : Expr(expr)
  107. {
  108. }
  109. TIdPart Clone() const {
  110. TIdPart res(Name);
  111. res.Expr = Expr ? Expr->Clone() : nullptr;
  112. return res;
  113. }
  114. };
  115. public:
  116. INode(TPosition pos);
  117. virtual ~INode();
  118. TPosition GetPos() const;
  119. const TString& GetLabel() const;
  120. TMaybe<TPosition> GetLabelPos() const;
  121. void SetLabel(const TString& label, TMaybe<TPosition> pos = {});
  122. bool IsImplicitLabel() const;
  123. void MarkImplicitLabel(bool isImplicitLabel);
  124. void SetCountHint(bool isCount);
  125. bool GetCountHint() const;
  126. bool Init(TContext& ctx, ISource* src);
  127. virtual bool InitReference(TContext& ctx);
  128. bool IsConstant() const;
  129. bool MaybeConstant() const;
  130. bool IsAggregated() const;
  131. bool IsAggregationKey() const;
  132. bool IsOverWindow() const;
  133. bool IsOverWindowDistinct() const;
  134. bool HasState(ENodeState state) const {
  135. PrecacheState();
  136. return State.Test(state);
  137. }
  138. virtual bool IsNull() const;
  139. virtual bool IsLiteral() const;
  140. virtual TString GetLiteralType() const;
  141. virtual TString GetLiteralValue() const;
  142. virtual bool IsIntegerLiteral() const;
  143. virtual TPtr ApplyUnaryOp(TContext& ctx, TPosition pos, const TString& opName) const;
  144. virtual bool IsAsterisk() const;
  145. virtual const TString* SubqueryAlias() const;
  146. virtual TString GetOpName() const;
  147. virtual const TString* GetLiteral(const TString& type) const;
  148. virtual const TString* GetColumnName() const;
  149. virtual bool IsPlainColumn() const;
  150. virtual bool IsTableRow() const;
  151. virtual void AssumeColumn();
  152. virtual const TString* GetSourceName() const;
  153. virtual const TString* GetAtomContent() const;
  154. virtual bool IsOptionalArg() const;
  155. virtual size_t GetTupleSize() const;
  156. virtual TPtr GetTupleElement(size_t index) const;
  157. virtual ITableKeys* GetTableKeys();
  158. virtual ISource* GetSource();
  159. virtual TVector<INode::TPtr>* ContentListPtr();
  160. virtual TAstNode* Translate(TContext& ctx) const = 0;
  161. virtual TAggregationPtr GetAggregation() const;
  162. virtual void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs);
  163. virtual TPtr WindowSpecFunc(const TPtr& type) const;
  164. virtual bool SetViewName(TContext& ctx, TPosition pos, const TString& view);
  165. virtual bool SetPrimaryView(TContext& ctx, TPosition pos);
  166. void UseAsInner();
  167. void DisableSort();
  168. virtual bool UsedSubquery() const;
  169. virtual bool IsSelect() const;
  170. virtual bool HasSelectResult() const;
  171. virtual const TString* FuncName() const;
  172. virtual const TString* ModuleName() const;
  173. virtual bool HasSkip() const;
  174. virtual TColumnNode* GetColumnNode();
  175. virtual const TColumnNode* GetColumnNode() const;
  176. virtual TTupleNode* GetTupleNode();
  177. virtual const TTupleNode* GetTupleNode() const;
  178. virtual TCallNode* GetCallNode();
  179. virtual const TCallNode* GetCallNode() const;
  180. virtual TStructNode* GetStructNode();
  181. virtual const TStructNode* GetStructNode() const;
  182. virtual TAccessNode* GetAccessNode();
  183. virtual const TAccessNode* GetAccessNode() const;
  184. virtual TLambdaNode* GetLambdaNode();
  185. virtual const TLambdaNode* GetLambdaNode() const;
  186. virtual TUdfNode* GetUdfNode();
  187. virtual const TUdfNode* GetUdfNode() const;
  188. using TVisitFunc = std::function<bool (const INode&)>;
  189. using TVisitNodeSet = std::unordered_set<const INode*>;
  190. void VisitTree(const TVisitFunc& func) const;
  191. void VisitTree(const TVisitFunc& func, TVisitNodeSet& visited) const;
  192. TPtr AstNode() const;
  193. TPtr AstNode(TAstNode* node) const;
  194. TPtr AstNode(TPtr node) const;
  195. TPtr AstNode(const TString& str) const;
  196. template <typename TVal, typename... TVals>
  197. void Add(TVal val, TVals... vals) {
  198. DoAdd(AstNode(val));
  199. Add(vals...);
  200. }
  201. void Add() {}
  202. // Y() Q() L()
  203. TPtr Y() const {
  204. return AstNode();
  205. }
  206. template <typename... TVals>
  207. TPtr Y(TVals... vals) const {
  208. TPtr node(AstNode());
  209. node->Add(vals...);
  210. return node;
  211. }
  212. template <typename T>
  213. TPtr Q(T a) const {
  214. return Y("quote", a);
  215. }
  216. template <typename... TVals>
  217. TPtr L(TPtr list, TVals... vals) const {
  218. Y_DEBUG_ABORT_UNLESS(list);
  219. auto copy = list->ShallowCopy();
  220. copy->Add(vals...);
  221. return copy;
  222. }
  223. TPtr Clone() const;
  224. protected:
  225. virtual TPtr ShallowCopy() const;
  226. virtual void DoUpdateState() const;
  227. virtual TPtr DoClone() const = 0;
  228. void PrecacheState() const;
  229. virtual void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const;
  230. private:
  231. virtual bool DoInit(TContext& ctx, ISource* src);
  232. virtual void DoAdd(TPtr node);
  233. protected:
  234. TPosition Pos;
  235. TString Label;
  236. TMaybe<TPosition> LabelPos;
  237. bool ImplicitLabel = false;
  238. mutable TNodeState State;
  239. bool AsInner = false;
  240. bool DisableSort_ = false;
  241. };
  242. typedef INode::TPtr TNodePtr;
  243. class IProxyNode : public INode {
  244. public:
  245. IProxyNode(TPosition pos, const TNodePtr& parent)
  246. : INode(pos)
  247. , Inner(parent)
  248. {}
  249. protected:
  250. virtual bool IsNull() const override;
  251. virtual bool IsLiteral() const override;
  252. virtual TString GetLiteralType() const override;
  253. virtual TString GetLiteralValue() const override;
  254. virtual bool IsIntegerLiteral() const override;
  255. virtual TPtr ApplyUnaryOp(TContext& ctx, TPosition pos, const TString& opName) const override;
  256. virtual bool IsAsterisk() const override;
  257. virtual const TString* SubqueryAlias() const override;
  258. virtual TString GetOpName() const override;
  259. virtual const TString* GetLiteral(const TString &type) const override;
  260. virtual const TString* GetColumnName() const override;
  261. virtual bool IsPlainColumn() const override;
  262. virtual bool IsTableRow() const override;
  263. virtual void AssumeColumn() override;
  264. virtual const TString* GetSourceName() const override;
  265. virtual const TString* GetAtomContent() const override;
  266. virtual bool IsOptionalArg() const override;
  267. virtual size_t GetTupleSize() const override;
  268. virtual TPtr GetTupleElement(size_t index) const override;
  269. virtual ITableKeys* GetTableKeys() override;
  270. virtual ISource* GetSource() override;
  271. virtual TVector<INode::TPtr>* ContentListPtr() override;
  272. virtual TAggregationPtr GetAggregation() const override;
  273. virtual void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs) override;
  274. virtual TPtr WindowSpecFunc(const TPtr& type) const override;
  275. virtual bool SetViewName(TContext& ctx, TPosition pos, const TString& view) override;
  276. virtual bool SetPrimaryView(TContext& ctx, TPosition pos) override;
  277. virtual bool UsedSubquery() const override;
  278. virtual bool IsSelect() const override;
  279. virtual bool HasSelectResult() const override;
  280. virtual const TString* FuncName() const override;
  281. virtual const TString* ModuleName() const override;
  282. virtual bool HasSkip() const override;
  283. virtual TColumnNode* GetColumnNode() override;
  284. virtual const TColumnNode* GetColumnNode() const override;
  285. virtual TTupleNode* GetTupleNode() override;
  286. virtual const TTupleNode* GetTupleNode() const override;
  287. virtual TCallNode* GetCallNode() override;
  288. virtual const TCallNode* GetCallNode() const override;
  289. virtual TStructNode* GetStructNode() override;
  290. virtual const TStructNode* GetStructNode() const override;
  291. virtual TAccessNode* GetAccessNode() override;
  292. virtual const TAccessNode* GetAccessNode() const override;
  293. virtual TLambdaNode* GetLambdaNode() override;
  294. virtual const TLambdaNode* GetLambdaNode() const override;
  295. virtual TUdfNode* GetUdfNode() override;
  296. virtual const TUdfNode* GetUdfNode() const override;
  297. protected:
  298. virtual void DoUpdateState() const override;
  299. virtual void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const override;
  300. virtual bool InitReference(TContext& ctx) override;
  301. virtual bool DoInit(TContext& ctx, ISource* src) override;
  302. private:
  303. virtual void DoAdd(TPtr node) override;
  304. protected:
  305. const TNodePtr Inner;
  306. };
  307. using TTableHints = TMap<TString, TVector<TNodePtr>>;
  308. void MergeHints(TTableHints& base, const TTableHints& overrides);
  309. template<class T>
  310. inline T SafeClone(const T& node) {
  311. return node ? node->Clone() : nullptr;
  312. }
  313. template<class T>
  314. inline TVector<T> CloneContainer(const TVector<T>& args) {
  315. TVector<T> cloneArgs;
  316. cloneArgs.reserve(args.size());
  317. for (const auto& arg: args) {
  318. cloneArgs.emplace_back(SafeClone(arg));
  319. }
  320. return cloneArgs;
  321. }
  322. TTableHints CloneContainer(const TTableHints& hints);
  323. class TAstAtomNode: public INode {
  324. public:
  325. TAstAtomNode(TPosition pos, const TString& content, ui32 flags, bool isOptionalArg);
  326. ~TAstAtomNode() override;
  327. TAstNode* Translate(TContext& ctx) const override;
  328. const TString& GetContent() const {
  329. return Content;
  330. }
  331. const TString* GetAtomContent() const override;
  332. bool IsOptionalArg() const override;
  333. protected:
  334. TString Content;
  335. ui32 Flags;
  336. bool IsOptionalArg_;
  337. void DoUpdateState() const override;
  338. };
  339. class TAstAtomNodeImpl final: public TAstAtomNode {
  340. public:
  341. TAstAtomNodeImpl(TPosition pos, const TString& content, ui32 flags, bool isOptionalArg = false)
  342. : TAstAtomNode(pos, content, flags, isOptionalArg)
  343. {}
  344. TNodePtr DoClone() const final {
  345. return new TAstAtomNodeImpl(Pos, Content, Flags, IsOptionalArg_);
  346. }
  347. };
  348. class TAstDirectNode final: public INode {
  349. public:
  350. TAstDirectNode(TAstNode* node);
  351. TAstNode* Translate(TContext& ctx) const override;
  352. TPtr DoClone() const final {
  353. return new TAstDirectNode(Node);
  354. }
  355. protected:
  356. TAstNode* Node;
  357. };
  358. class TAstListNode: public INode {
  359. public:
  360. TAstListNode(TPosition pos);
  361. virtual ~TAstListNode();
  362. TAstNode* Translate(TContext& ctx) const override;
  363. protected:
  364. explicit TAstListNode(const TAstListNode& node);
  365. explicit TAstListNode(TPosition pos, TVector<TNodePtr>&& nodes);
  366. TPtr ShallowCopy() const override;
  367. bool DoInit(TContext& ctx, ISource* src) override;
  368. void DoAdd(TNodePtr node) override;
  369. void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const override;
  370. void DoUpdateState() const override;
  371. void UpdateStateByListNodes(const TVector<TNodePtr>& Nodes) const;
  372. protected:
  373. TVector<TNodePtr> Nodes;
  374. mutable TMaybe<bool> CacheGroupKey;
  375. };
  376. class TAstListNodeImpl final: public TAstListNode {
  377. public:
  378. TAstListNodeImpl(TPosition pos);
  379. TAstListNodeImpl(TPosition pos, TVector<TNodePtr> nodes);
  380. void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs) override;
  381. protected:
  382. TNodePtr DoClone() const final;
  383. };
  384. class TCallNode: public TAstListNode {
  385. public:
  386. TCallNode(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  387. TCallNode(TPosition pos, const TString& opName, const TVector<TNodePtr>& args)
  388. : TCallNode(pos, opName, args.size(), args.size(), args)
  389. {}
  390. TString GetOpName() const override;
  391. const TString* GetSourceName() const override;
  392. const TVector<TNodePtr>& GetArgs() const;
  393. TCallNode* GetCallNode() override;
  394. const TCallNode* GetCallNode() const override;
  395. protected:
  396. bool DoInit(TContext& ctx, ISource* src) override;
  397. bool ValidateArguments(TContext& ctx) const;
  398. TString GetCallExplain() const;
  399. void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs) override;
  400. protected:
  401. TString OpName;
  402. i32 MinArgs;
  403. i32 MaxArgs;
  404. TVector<TNodePtr> Args;
  405. mutable TMaybe<bool> CacheGroupKey;
  406. void DoUpdateState() const override;
  407. };
  408. class TCallNodeImpl final: public TCallNode {
  409. TPtr DoClone() const final;
  410. public:
  411. TCallNodeImpl(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  412. TCallNodeImpl(TPosition pos, const TString& opName, const TVector<TNodePtr>& args);
  413. };
  414. class TFuncNodeImpl final : public TCallNode {
  415. TPtr DoClone() const final;
  416. public:
  417. TFuncNodeImpl(TPosition pos, const TString& opName);
  418. const TString* FuncName() const override;
  419. };
  420. class TCallNodeDepArgs final : public TCallNode {
  421. TPtr DoClone() const final;
  422. public:
  423. TCallNodeDepArgs(ui32 reqArgsCount, TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  424. TCallNodeDepArgs(ui32 reqArgsCount, TPosition pos, const TString& opName, const TVector<TNodePtr>& args);
  425. protected:
  426. bool DoInit(TContext& ctx, ISource* src) override;
  427. private:
  428. const ui32 ReqArgsCount;
  429. };
  430. class TCallDirectRow final : public TCallNode {
  431. TPtr DoClone() const final;
  432. public:
  433. TCallDirectRow(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  434. TCallDirectRow(TPosition pos, const TString& opName, const TVector<TNodePtr>& args);
  435. protected:
  436. bool DoInit(TContext& ctx, ISource* src) override;
  437. void DoUpdateState() const override;
  438. };
  439. class TWinAggrEmulation: public TCallNode {
  440. protected:
  441. void DoUpdateState() const override;
  442. bool DoInit(TContext& ctx, ISource* src) override;
  443. TPtr WindowSpecFunc(const TNodePtr& type) const override;
  444. public:
  445. TWinAggrEmulation(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  446. protected:
  447. template<class TNodeType>
  448. TPtr CallNodeClone() const {
  449. return new TNodeType(GetPos(), OpName, MinArgs, MaxArgs, CloneContainer(Args));
  450. }
  451. TString FuncAlias;
  452. };
  453. using TFunctionConfig = TMap<TString, TNodePtr>;
  454. class TExternalFunctionConfig final: public TAstListNode {
  455. public:
  456. TExternalFunctionConfig(TPosition pos, const TFunctionConfig& config)
  457. : TAstListNode(pos)
  458. , Config(config)
  459. {
  460. }
  461. bool DoInit(TContext& ctx, ISource* src) override;
  462. TPtr DoClone() const final;
  463. private:
  464. TFunctionConfig Config;
  465. };
  466. class TWinRowNumber final: public TWinAggrEmulation {
  467. TPtr DoClone() const final {
  468. return CallNodeClone<TWinRowNumber>();
  469. }
  470. public:
  471. TWinRowNumber(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  472. };
  473. class TWinCumeDist final: public TWinAggrEmulation {
  474. TPtr DoClone() const final {
  475. return CallNodeClone<TWinCumeDist>();
  476. }
  477. bool DoInit(TContext& ctx, ISource* src) override;
  478. public:
  479. TWinCumeDist(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  480. };
  481. class TWinNTile final: public TWinAggrEmulation {
  482. TPtr DoClone() const final {
  483. return CallNodeClone<TWinNTile>();
  484. }
  485. bool DoInit(TContext& ctx, ISource* src) override;
  486. public:
  487. TWinNTile(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  488. private:
  489. TSourcePtr FakeSource;
  490. };
  491. class TWinLeadLag final: public TWinAggrEmulation {
  492. TPtr DoClone() const final {
  493. return CallNodeClone<TWinLeadLag>();
  494. }
  495. bool DoInit(TContext& ctx, ISource* src) override;
  496. public:
  497. TWinLeadLag(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  498. };
  499. class TWinRank final: public TWinAggrEmulation {
  500. TPtr DoClone() const final {
  501. return CallNodeClone<TWinRank>();
  502. }
  503. bool DoInit(TContext& ctx, ISource* src) override;
  504. public:
  505. TWinRank(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector<TNodePtr>& args);
  506. };
  507. struct TViewDescription {
  508. TString ViewName = "";
  509. bool PrimaryFlag = false;
  510. bool empty() const { return *this == TViewDescription(); }
  511. bool operator == (const TViewDescription&) const = default;
  512. };
  513. class ITableKeys: public INode {
  514. public:
  515. enum class EBuildKeysMode {
  516. CREATE,
  517. DROP,
  518. INPUT,
  519. WRITE
  520. };
  521. ITableKeys(TPosition pos);
  522. virtual const TString* GetTableName() const;
  523. virtual TNodePtr BuildKeys(TContext& ctx, EBuildKeysMode mode) = 0;
  524. protected:
  525. TNodePtr AddView(TNodePtr key, const TViewDescription& view);
  526. private:
  527. /// all TableKeys no clonnable
  528. TPtr DoClone() const final {
  529. return {};
  530. }
  531. ITableKeys* GetTableKeys() override;
  532. TAstNode* Translate(TContext& ctx) const override;
  533. };
  534. enum class ESampleClause {
  535. TableSample, //from SQL standard, percantage rate (0..100)
  536. Sample //simplified (implied Bernulli mode), fraction (0..1)
  537. };
  538. enum class ESampleMode {
  539. Bernoulli,
  540. System
  541. };
  542. class TDeferredAtom {
  543. public:
  544. TDeferredAtom();
  545. TDeferredAtom(TPosition pos, const TString& str);
  546. TDeferredAtom(TNodePtr node, TContext& ctx);
  547. const TString* GetLiteral() const;
  548. bool GetLiteral(TString& value, TContext& ctx) const;
  549. TNodePtr Build() const;
  550. TString GetRepr() const;
  551. bool Empty() const;
  552. bool HasNode() const;
  553. private:
  554. TMaybe<TString> Explicit;
  555. TNodePtr Node; // atom or evaluation node
  556. TString Repr;
  557. };
  558. struct TTopicRef {
  559. TString RefName;
  560. TDeferredAtom Cluster;
  561. TNodePtr Consumers;
  562. TNodePtr Settings;
  563. TNodePtr Keys;
  564. TTopicRef() = default;
  565. TTopicRef(const TString& refName, const TDeferredAtom& cluster, TNodePtr keys);
  566. TTopicRef(const TTopicRef&) = default;
  567. TTopicRef& operator=(const TTopicRef&) = default;
  568. };
  569. struct TIdentifier {
  570. TPosition Pos;
  571. TString Name;
  572. TIdentifier(TPosition pos, const TString& name)
  573. : Pos(pos)
  574. , Name(name) {}
  575. };
  576. struct TColumnConstraints {
  577. TNodePtr DefaultExpr;
  578. bool Nullable = true;
  579. TColumnConstraints(TNodePtr defaultExpr, bool nullable);
  580. };
  581. struct TColumnSchema {
  582. enum class ETypeOfChange {
  583. Nothing,
  584. DropNotNullConstraint,
  585. SetNotNullConstraint, // todo flown4qqqq
  586. SetFamily
  587. };
  588. TPosition Pos;
  589. TString Name;
  590. TNodePtr Type;
  591. bool Nullable;
  592. TVector<TIdentifier> Families;
  593. bool Serial;
  594. TNodePtr DefaultExpr;
  595. const ETypeOfChange TypeOfChange;
  596. TColumnSchema(TPosition pos, const TString& name, const TNodePtr& type, bool nullable,
  597. TVector<TIdentifier> families, bool serial, TNodePtr defaultExpr, ETypeOfChange typeOfChange = ETypeOfChange::Nothing);
  598. };
  599. struct TColumns: public TSimpleRefCount<TColumns> {
  600. TSet<TString> Real;
  601. TSet<TString> Artificial;
  602. TVector<TString> List;
  603. TVector<bool> NamedColumns;
  604. bool All = false;
  605. bool QualifiedAll = false;
  606. bool HasUnreliable = false;
  607. bool HasUnnamed = false;
  608. bool Add(const TString* column, bool countHint, bool isArtificial = false, bool isReliable = true);
  609. TString AddUnnamed();
  610. void Merge(const TColumns& columns);
  611. void SetPrefix(const TString& prefix);
  612. void SetAll();
  613. bool IsColumnPossible(TContext& ctx, const TString& column) const;
  614. };
  615. class TSortSpecification: public TSimpleRefCount<TSortSpecification> {
  616. public:
  617. TSortSpecification(const TNodePtr& orderExpr, bool ascending);
  618. const TNodePtr OrderExpr;
  619. const bool Ascending;
  620. TIntrusivePtr<TSortSpecification> Clone() const;
  621. ~TSortSpecification() {}
  622. private:
  623. const TNodePtr CleanOrderExpr;
  624. };
  625. typedef TIntrusivePtr<TSortSpecification> TSortSpecificationPtr;
  626. enum EFrameType {
  627. FrameByRows,
  628. FrameByRange,
  629. FrameByGroups,
  630. };
  631. enum EFrameExclusions {
  632. FrameExclNone, // same as EXCLUDE NO OTHERS
  633. FrameExclCurRow,
  634. FrameExclGroup,
  635. FrameExclTies,
  636. };
  637. enum EFrameSettings {
  638. // keep order
  639. FrameUndefined,
  640. FramePreceding,
  641. FrameCurrentRow,
  642. FrameFollowing,
  643. };
  644. struct TFrameBound: public TSimpleRefCount<TFrameBound> {
  645. TPosition Pos;
  646. TNodePtr Bound;
  647. EFrameSettings Settings = FrameUndefined;
  648. TIntrusivePtr<TFrameBound> Clone() const;
  649. ~TFrameBound() {}
  650. };
  651. typedef TIntrusivePtr<TFrameBound> TFrameBoundPtr;
  652. struct TFrameSpecification: public TSimpleRefCount<TFrameSpecification> {
  653. EFrameType FrameType = FrameByRows;
  654. TFrameBoundPtr FrameBegin;
  655. TFrameBoundPtr FrameEnd;
  656. EFrameExclusions FrameExclusion = FrameExclNone;
  657. TIntrusivePtr<TFrameSpecification> Clone() const;
  658. ~TFrameSpecification() {}
  659. };
  660. typedef TIntrusivePtr<TFrameSpecification> TFrameSpecificationPtr;
  661. struct TLegacyHoppingWindowSpec: public TSimpleRefCount<TLegacyHoppingWindowSpec> {
  662. TNodePtr TimeExtractor;
  663. TNodePtr Hop;
  664. TNodePtr Interval;
  665. TNodePtr Delay;
  666. bool DataWatermarks;
  667. TIntrusivePtr<TLegacyHoppingWindowSpec> Clone() const;
  668. ~TLegacyHoppingWindowSpec() {}
  669. };
  670. typedef TIntrusivePtr<TLegacyHoppingWindowSpec> TLegacyHoppingWindowSpecPtr;
  671. struct TWindowSpecification: public TSimpleRefCount<TWindowSpecification> {
  672. TMaybe<TString> ExistingWindowName;
  673. TVector<TNodePtr> Partitions;
  674. bool IsCompact = false;
  675. TVector<TSortSpecificationPtr> OrderBy;
  676. TNodePtr Session;
  677. TFrameSpecificationPtr Frame;
  678. TIntrusivePtr<TWindowSpecification> Clone() const;
  679. ~TWindowSpecification() {}
  680. };
  681. typedef TIntrusivePtr<TWindowSpecification> TWindowSpecificationPtr;
  682. typedef TMap<TString, TWindowSpecificationPtr> TWinSpecs;
  683. TWinSpecs CloneContainer(const TWinSpecs& specs);
  684. void WarnIfAliasFromSelectIsUsedInGroupBy(TContext& ctx, const TVector<TNodePtr>& selectTerms, const TVector<TNodePtr>& groupByTerms,
  685. const TVector<TNodePtr>& groupByExprTerms);
  686. bool ValidateAllNodesForAggregation(TContext& ctx, const TVector<TNodePtr>& nodes);
  687. struct TWriteSettings {
  688. bool Discard = false;
  689. TDeferredAtom Label;
  690. };
  691. class TColumnNode final: public INode {
  692. public:
  693. TColumnNode(TPosition pos, const TString& column, const TString& source, bool maybeType);
  694. TColumnNode(TPosition pos, const TNodePtr& column, const TString& source);
  695. virtual ~TColumnNode();
  696. bool IsAsterisk() const override;
  697. virtual bool IsArtificial() const;
  698. const TString* GetColumnName() const override;
  699. const TString* GetSourceName() const override;
  700. TColumnNode* GetColumnNode() override;
  701. const TColumnNode* GetColumnNode() const override;
  702. TAstNode* Translate(TContext& ctx) const override;
  703. void ResetColumn(const TString& column, const TString& source);
  704. void ResetColumn(const TNodePtr& column, const TString& source);
  705. void SetUseSourceAsColumn();
  706. void SetUseSource();
  707. void ResetAsReliable();
  708. void SetAsNotReliable();
  709. bool IsReliable() const;
  710. bool IsUseSourceAsColumn() const;
  711. bool IsUseSource() const;
  712. bool CanBeType() const;
  713. private:
  714. bool DoInit(TContext& ctx, ISource* src) override;
  715. TPtr DoClone() const final;
  716. void DoUpdateState() const override;
  717. private:
  718. static const TString Empty;
  719. TNodePtr Node;
  720. TString ColumnName;
  721. TNodePtr ColumnExpr;
  722. TString Source;
  723. bool GroupKey = false;
  724. bool Artificial = false;
  725. bool Reliable = true;
  726. bool UseSource = false;
  727. bool UseSourceAsColumn = false;
  728. bool MaybeType = false;
  729. };
  730. class TArgPlaceholderNode final: public INode
  731. {
  732. public:
  733. TArgPlaceholderNode(TPosition pos, const TString &name);
  734. TAstNode* Translate(TContext& ctx) const override;
  735. TString GetName() const;
  736. TNodePtr DoClone() const final;
  737. protected:
  738. bool DoInit(TContext& ctx, ISource* src) override;
  739. private:
  740. TString Name;
  741. };
  742. enum class EAggregateMode {
  743. Normal,
  744. Distinct,
  745. OverWindow,
  746. OverWindowDistinct,
  747. };
  748. class TTupleNode: public TAstListNode {
  749. public:
  750. TTupleNode(TPosition pos, const TVector<TNodePtr>& exprs);
  751. bool IsEmpty() const;
  752. const TVector<TNodePtr>& Elements() const;
  753. TTupleNode* GetTupleNode() override;
  754. const TTupleNode* GetTupleNode() const override;
  755. bool DoInit(TContext& ctx, ISource* src) override;
  756. size_t GetTupleSize() const override;
  757. TPtr GetTupleElement(size_t index) const override;
  758. TNodePtr DoClone() const final;
  759. private:
  760. void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs) override;
  761. const TString* GetSourceName() const override;
  762. const TVector<TNodePtr> Exprs;
  763. };
  764. class TStructNode: public TAstListNode {
  765. public:
  766. TStructNode(TPosition pos, const TVector<TNodePtr>& exprs, const TVector<TNodePtr>& labels, bool ordered);
  767. bool DoInit(TContext& ctx, ISource* src) override;
  768. TNodePtr DoClone() const final;
  769. const TVector<TNodePtr>& GetExprs() {
  770. return Exprs;
  771. }
  772. TStructNode* GetStructNode() override;
  773. const TStructNode* GetStructNode() const override;
  774. private:
  775. void CollectPreaggregateExprs(TContext& ctx, ISource& src, TVector<INode::TPtr>& exprs) override;
  776. const TString* GetSourceName() const override;
  777. const TVector<TNodePtr> Exprs;
  778. const TVector<TNodePtr> Labels;
  779. const bool Ordered;
  780. };
  781. class TUdfNode: public INode {
  782. public:
  783. TUdfNode(TPosition pos, const TVector<TNodePtr>& args);
  784. bool DoInit(TContext& ctx, ISource* src) override final;
  785. TNodePtr DoClone() const override final;
  786. TAstNode* Translate(TContext& ctx) const override;
  787. const TNodePtr GetExternalTypes() const;
  788. const TString& GetFunction() const;
  789. const TString& GetModule() const;
  790. TNodePtr GetRunConfig() const;
  791. const TDeferredAtom& GetTypeConfig() const;
  792. TUdfNode* GetUdfNode() override;
  793. const TUdfNode* GetUdfNode() const override;
  794. private:
  795. TVector<TNodePtr> Args;
  796. const TString* FunctionName;
  797. const TString* ModuleName;
  798. TNodePtr ExternalTypesTuple = nullptr;
  799. TNodePtr RunConfig;
  800. TDeferredAtom TypeConfig;
  801. };
  802. class IAggregation: public INode {
  803. public:
  804. bool IsDistinct() const;
  805. void DoUpdateState() const override;
  806. virtual const TString* GetGenericKey() const;
  807. virtual bool InitAggr(TContext& ctx, bool isFactory, ISource* src, TAstListNode& node, const TVector<TNodePtr>& exprs) = 0;
  808. virtual std::pair<TNodePtr, bool> AggregationTraits(const TNodePtr& type, bool overState, bool many, bool allowAggApply, TContext& ctx) const;
  809. virtual TNodePtr AggregationTraitsFactory() const = 0;
  810. virtual std::vector<ui32> GetFactoryColumnIndices() const;
  811. virtual void AddFactoryArguments(TNodePtr& apply) const;
  812. virtual TNodePtr WindowTraits(const TNodePtr& type, TContext& ctx) const;
  813. const TString& GetName() const;
  814. EAggregateMode GetAggregationMode() const;
  815. void MarkKeyColumnAsGenerated();
  816. virtual void Join(IAggregation* aggr);
  817. private:
  818. virtual TNodePtr GetApply(const TNodePtr& type, bool many, bool allowAggApply, TContext& ctx) const = 0;
  819. protected:
  820. IAggregation(TPosition pos, const TString& name, const TString& func, EAggregateMode mode);
  821. TAstNode* Translate(TContext& ctx) const override;
  822. TNodePtr WrapIfOverState(const TNodePtr& input, bool overState, bool many, TContext& ctx) const;
  823. virtual TNodePtr GetExtractor(bool many, TContext& ctx) const = 0;
  824. TString Name;
  825. TString Func;
  826. const EAggregateMode AggMode;
  827. TString DistinctKey;
  828. bool IsGeneratedKeyColumn = false;
  829. };
  830. enum class EExprSeat: int {
  831. Open = 0,
  832. FlattenByExpr,
  833. FlattenBy,
  834. GroupBy,
  835. DistinctAggr,
  836. WindowPartitionBy,
  837. Max
  838. };
  839. enum class EExprType: int {
  840. WithExpression,
  841. ColumnOnly,
  842. };
  843. enum class EOrderKind: int {
  844. None,
  845. Sort,
  846. Assume,
  847. Passthrough
  848. };
  849. class TListOfNamedNodes final: public INode {
  850. public:
  851. TListOfNamedNodes(TPosition pos, TVector<TNodePtr>&& exprs);
  852. TVector<TNodePtr>* ContentListPtr() override;
  853. TAstNode* Translate(TContext& ctx) const override;
  854. TPtr DoClone() const final;
  855. void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const final;
  856. private:
  857. TVector<TNodePtr> Exprs;
  858. TString Meaning;
  859. };
  860. class TLiteralNode: public TAstListNode {
  861. public:
  862. TLiteralNode(TPosition pos, bool isNull);
  863. TLiteralNode(TPosition pos, const TString& type, const TString& value);
  864. TLiteralNode(TPosition pos, const TString& value, ui32 nodeFlags);
  865. TLiteralNode(TPosition pos, const TString& value, ui32 nodeFlags, const TString& type);
  866. bool IsNull() const override;
  867. const TString* GetLiteral(const TString& type) const override;
  868. void DoUpdateState() const override;
  869. TPtr DoClone() const override;
  870. bool IsLiteral() const override;
  871. TString GetLiteralType() const override;
  872. TString GetLiteralValue() const override;
  873. protected:
  874. bool Null;
  875. bool Void;
  876. TString Type;
  877. TString Value;
  878. };
  879. class TAsteriskNode: public INode {
  880. public:
  881. TAsteriskNode(TPosition pos);
  882. bool IsAsterisk() const override;
  883. TPtr DoClone() const override;
  884. TAstNode* Translate(TContext& ctx) const override;
  885. };
  886. template<typename T>
  887. class TLiteralNumberNode: public TLiteralNode {
  888. public:
  889. TLiteralNumberNode(TPosition pos, const TString& type, const TString& value, bool implicitType = false);
  890. TPtr DoClone() const override final;
  891. bool DoInit(TContext& ctx, ISource* src) override;
  892. bool IsIntegerLiteral() const override;
  893. TPtr ApplyUnaryOp(TContext& ctx, TPosition pos, const TString& opName) const override;
  894. private:
  895. const bool ImplicitType;
  896. };
  897. struct TTableArg {
  898. bool HasAt = false;
  899. TNodePtr Expr;
  900. TDeferredAtom Id;
  901. TViewDescription View;
  902. };
  903. class TTableRows final : public INode {
  904. public:
  905. TTableRows(TPosition pos, const TVector<TNodePtr>& args);
  906. TTableRows(TPosition pos, ui32 argsCount);
  907. bool DoInit(TContext& ctx, ISource* src) override;
  908. void DoUpdateState() const override;
  909. TNodePtr DoClone() const final;
  910. TAstNode* Translate(TContext& ctx) const override;
  911. private:
  912. ui32 ArgsCount;
  913. TNodePtr Node;
  914. };
  915. struct TStringContent {
  916. TString Content;
  917. NYql::NUdf::EDataSlot Type = NYql::NUdf::EDataSlot::String;
  918. TMaybe<TString> PgType;
  919. ui32 Flags = NYql::TNodeFlags::Default;
  920. };
  921. TMaybe<TStringContent> StringContent(TContext& ctx, TPosition pos, const TString& input);
  922. TMaybe<TStringContent> StringContentOrIdContent(TContext& ctx, TPosition pos, const TString& input);
  923. struct TTtlSettings {
  924. enum class EUnit {
  925. Seconds /* "seconds" */,
  926. Milliseconds /* "milliseconds" */,
  927. Microseconds /* "microseconds" */,
  928. Nanoseconds /* "nanoseconds" */,
  929. };
  930. struct TTierSettings {
  931. TNodePtr EvictionDelay;
  932. std::optional<TIdentifier> StorageName;
  933. TTierSettings(const TNodePtr& evictionDelay, const std::optional<TIdentifier>& storageName = std::nullopt);
  934. };
  935. TIdentifier ColumnName;
  936. std::vector<TTierSettings> Tiers;
  937. TMaybe<EUnit> ColumnUnit;
  938. TTtlSettings(const TIdentifier& columnName, const std::vector<TTierSettings>& tiers, const TMaybe<EUnit>& columnUnit = {});
  939. };
  940. struct TTableSettings {
  941. TNodePtr CompactionPolicy;
  942. TMaybe<TIdentifier> AutoPartitioningBySize;
  943. TNodePtr PartitionSizeMb;
  944. TMaybe<TIdentifier> AutoPartitioningByLoad;
  945. TNodePtr MinPartitions;
  946. TNodePtr MaxPartitions;
  947. TNodePtr PartitionCount;
  948. TNodePtr UniformPartitions;
  949. TVector<TVector<TNodePtr>> PartitionAtKeys;
  950. TMaybe<TIdentifier> KeyBloomFilter;
  951. TNodePtr ReadReplicasSettings;
  952. NYql::TResetableSetting<TTtlSettings, void> TtlSettings;
  953. NYql::TResetableSetting<TNodePtr, void> Tiering;
  954. TMaybe<TIdentifier> StoreType;
  955. TNodePtr PartitionByHashFunction;
  956. TMaybe<TIdentifier> StoreExternalBlobs;
  957. TNodePtr DataSourcePath;
  958. NYql::TResetableSetting<TNodePtr, void> Location;
  959. TVector<NYql::TResetableSetting<std::pair<TIdentifier, TNodePtr>, TIdentifier>> ExternalSourceParameters;
  960. bool IsSet() const {
  961. return CompactionPolicy || AutoPartitioningBySize || PartitionSizeMb || AutoPartitioningByLoad
  962. || MinPartitions || MaxPartitions || UniformPartitions || PartitionAtKeys || KeyBloomFilter
  963. || ReadReplicasSettings || TtlSettings || Tiering || StoreType || PartitionByHashFunction
  964. || StoreExternalBlobs || DataSourcePath || Location || ExternalSourceParameters;
  965. }
  966. };
  967. struct TFamilyEntry {
  968. TFamilyEntry(const TIdentifier& name)
  969. :Name(name)
  970. {}
  971. TIdentifier Name;
  972. TNodePtr Data;
  973. TNodePtr Compression;
  974. TNodePtr CompressionLevel;
  975. };
  976. struct TVectorIndexSettings {
  977. enum class EDistance {
  978. Cosine /* "cosine" */
  979. , Manhattan /* "manhattan" */
  980. , Euclidean /* "euclidean" */
  981. };
  982. enum class ESimilarity {
  983. Cosine /* "cosine" */
  984. , InnerProduct /* "inner_product" */
  985. };
  986. enum class EVectorType {
  987. Float /* "float" */
  988. , Uint8 /* "uint8" */
  989. , Int8 /* "int8" */
  990. , Bit /* "bit" */
  991. };
  992. std::optional<EDistance> Distance;
  993. std::optional<ESimilarity> Similarity;
  994. std::optional<EVectorType> VectorType;
  995. ui32 VectorDimension = 0;
  996. ui32 Clusters = 0;
  997. ui32 Levels = 0;
  998. bool Validate(TContext& ctx) const;
  999. };
  1000. struct TIndexDescription {
  1001. enum class EType {
  1002. GlobalSync,
  1003. GlobalAsync,
  1004. GlobalSyncUnique,
  1005. GlobalVectorKmeansTree,
  1006. };
  1007. TIndexDescription(const TIdentifier& name, EType type = EType::GlobalSync)
  1008. : Name(name)
  1009. , Type(type)
  1010. {}
  1011. TIdentifier Name;
  1012. EType Type;
  1013. TVector<TIdentifier> IndexColumns;
  1014. TVector<TIdentifier> DataColumns;
  1015. TTableSettings TableSettings;
  1016. using TIndexSettings = std::variant<std::monostate, TVectorIndexSettings>;
  1017. TIndexSettings IndexSettings;
  1018. };
  1019. struct TChangefeedSettings {
  1020. struct TLocalSinkSettings {
  1021. // no special settings
  1022. };
  1023. TNodePtr Mode;
  1024. TNodePtr Format;
  1025. TNodePtr InitialScan;
  1026. TNodePtr VirtualTimestamps;
  1027. TNodePtr ResolvedTimestamps;
  1028. TNodePtr RetentionPeriod;
  1029. TNodePtr TopicAutoPartitioning;
  1030. TNodePtr TopicPartitions;
  1031. TNodePtr TopicMaxActivePartitions;
  1032. TNodePtr AwsRegion;
  1033. std::optional<std::variant<TLocalSinkSettings>> SinkSettings;
  1034. };
  1035. struct TChangefeedDescription {
  1036. TChangefeedDescription(const TIdentifier& name)
  1037. : Name(name)
  1038. , Disable(false)
  1039. {}
  1040. TIdentifier Name;
  1041. TChangefeedSettings Settings;
  1042. bool Disable;
  1043. };
  1044. struct TCreateTableParameters {
  1045. TVector<TColumnSchema> Columns;
  1046. TVector<TIdentifier> PkColumns;
  1047. TVector<TIdentifier> PartitionByColumns;
  1048. TVector<std::pair<TIdentifier, bool>> OrderByColumns;
  1049. TVector<TIndexDescription> Indexes;
  1050. TVector<TFamilyEntry> ColumnFamilies;
  1051. TVector<TChangefeedDescription> Changefeeds;
  1052. TTableSettings TableSettings;
  1053. ETableType TableType = ETableType::Table;
  1054. bool Temporary = false;
  1055. };
  1056. struct TTableRef;
  1057. struct TAnalyzeParams {
  1058. std::shared_ptr<TTableRef> Table;
  1059. TVector<TString> Columns;
  1060. };
  1061. struct TAlterTableParameters {
  1062. TVector<TColumnSchema> AddColumns;
  1063. TVector<TString> DropColumns;
  1064. TVector<TColumnSchema> AlterColumns;
  1065. TVector<TFamilyEntry> AddColumnFamilies;
  1066. TVector<TFamilyEntry> AlterColumnFamilies;
  1067. TTableSettings TableSettings;
  1068. TVector<TIndexDescription> AddIndexes;
  1069. TVector<TIndexDescription> AlterIndexes;
  1070. TVector<TIdentifier> DropIndexes;
  1071. TMaybe<std::pair<TIdentifier, TIdentifier>> RenameIndexTo;
  1072. TMaybe<TIdentifier> RenameTo;
  1073. TVector<TChangefeedDescription> AddChangefeeds;
  1074. TVector<TChangefeedDescription> AlterChangefeeds;
  1075. TVector<TIdentifier> DropChangefeeds;
  1076. ETableType TableType = ETableType::Table;
  1077. bool IsEmpty() const {
  1078. return AddColumns.empty() && DropColumns.empty() && AlterColumns.empty()
  1079. && AddColumnFamilies.empty() && AlterColumnFamilies.empty()
  1080. && !TableSettings.IsSet()
  1081. && AddIndexes.empty() && AlterIndexes.empty() && DropIndexes.empty() && !RenameIndexTo.Defined()
  1082. && !RenameTo.Defined()
  1083. && AddChangefeeds.empty() && AlterChangefeeds.empty() && DropChangefeeds.empty();
  1084. }
  1085. };
  1086. struct TRoleParameters {
  1087. TMaybe<TDeferredAtom> Password;
  1088. bool IsPasswordEncrypted = false;
  1089. TVector<TDeferredAtom> Roles;
  1090. };
  1091. struct TSequenceParameters {
  1092. bool MissingOk = false;
  1093. TMaybe<TDeferredAtom> StartValue;
  1094. bool IsRestart = false;
  1095. TMaybe<TDeferredAtom> RestartValue;
  1096. TMaybe<TDeferredAtom> Increment;
  1097. };
  1098. struct TTopicConsumerSettings {
  1099. struct TLocalSinkSettings {
  1100. // no special settings
  1101. };
  1102. TNodePtr Important;
  1103. NYql::TResetableSetting<TNodePtr, void> ReadFromTs;
  1104. NYql::TResetableSetting<TNodePtr, void> SupportedCodecs;
  1105. };
  1106. struct TTopicConsumerDescription {
  1107. TTopicConsumerDescription(const TIdentifier& name)
  1108. : Name(name)
  1109. {}
  1110. TIdentifier Name;
  1111. TTopicConsumerSettings Settings;
  1112. };
  1113. struct TTopicSettings {
  1114. NYql::TResetableSetting<TNodePtr, void> MinPartitions;
  1115. NYql::TResetableSetting<TNodePtr, void> MaxPartitions;
  1116. NYql::TResetableSetting<TNodePtr, void> RetentionPeriod;
  1117. NYql::TResetableSetting<TNodePtr, void> RetentionStorage;
  1118. NYql::TResetableSetting<TNodePtr, void> SupportedCodecs;
  1119. NYql::TResetableSetting<TNodePtr, void> PartitionWriteSpeed;
  1120. NYql::TResetableSetting<TNodePtr, void> PartitionWriteBurstSpeed;
  1121. NYql::TResetableSetting<TNodePtr, void> MeteringMode;
  1122. NYql::TResetableSetting<TNodePtr, void> AutoPartitioningStabilizationWindow;
  1123. NYql::TResetableSetting<TNodePtr, void> AutoPartitioningUpUtilizationPercent;
  1124. NYql::TResetableSetting<TNodePtr, void> AutoPartitioningDownUtilizationPercent;
  1125. NYql::TResetableSetting<TNodePtr, void> AutoPartitioningStrategy;
  1126. bool IsSet() const {
  1127. return MinPartitions ||
  1128. MaxPartitions ||
  1129. RetentionPeriod ||
  1130. RetentionStorage ||
  1131. SupportedCodecs ||
  1132. PartitionWriteSpeed ||
  1133. PartitionWriteBurstSpeed ||
  1134. MeteringMode ||
  1135. AutoPartitioningStabilizationWindow ||
  1136. AutoPartitioningUpUtilizationPercent ||
  1137. AutoPartitioningDownUtilizationPercent ||
  1138. AutoPartitioningStrategy
  1139. ;
  1140. }
  1141. };
  1142. struct TCreateTopicParameters {
  1143. TVector<TTopicConsumerDescription> Consumers;
  1144. TTopicSettings TopicSettings;
  1145. bool ExistingOk;
  1146. };
  1147. struct TAlterTopicParameters {
  1148. TVector<TTopicConsumerDescription> AddConsumers;
  1149. THashMap<TString, TTopicConsumerDescription> AlterConsumers;
  1150. TVector<TIdentifier> DropConsumers;
  1151. TTopicSettings TopicSettings;
  1152. bool MissingOk;
  1153. };
  1154. struct TDropTopicParameters {
  1155. bool MissingOk;
  1156. };
  1157. struct TCreateBackupCollectionParameters {
  1158. std::map<TString, TDeferredAtom> Settings;
  1159. bool Database;
  1160. TVector<TDeferredAtom> Tables;
  1161. bool ExistingOk;
  1162. };
  1163. struct TAlterBackupCollectionParameters {
  1164. enum class EDatabase {
  1165. Unchanged,
  1166. Add,
  1167. Drop,
  1168. };
  1169. std::map<TString, TDeferredAtom> Settings;
  1170. std::set<TString> SettingsToReset;
  1171. EDatabase Database = EDatabase::Unchanged;
  1172. TVector<TDeferredAtom> TablesToAdd;
  1173. TVector<TDeferredAtom> TablesToDrop;
  1174. bool MissingOk;
  1175. };
  1176. struct TDropBackupCollectionParameters {
  1177. bool MissingOk;
  1178. };
  1179. struct TBackupParameters {
  1180. bool Incremental = false;
  1181. };
  1182. struct TRestoreParameters {
  1183. TString At;
  1184. };
  1185. TString IdContent(TContext& ctx, const TString& str);
  1186. TString IdContentFromString(TContext& ctx, const TString& str);
  1187. TTableHints GetContextHints(TContext& ctx);
  1188. TString TypeByAlias(const TString& alias, bool normalize = true);
  1189. TNodePtr BuildAtom(TPosition pos, const TString& content, ui32 flags = NYql::TNodeFlags::ArbitraryContent,
  1190. bool isOptionalArg = false);
  1191. TNodePtr BuildQuotedAtom(TPosition pos, const TString& content, ui32 flags = NYql::TNodeFlags::ArbitraryContent);
  1192. TNodePtr BuildLiteralNull(TPosition pos);
  1193. TNodePtr BuildLiteralVoid(TPosition pos);
  1194. /// String is checked as quotable, support escaping and multiline
  1195. TNodePtr BuildLiteralSmartString(TContext& ctx, const TString& value);
  1196. struct TExprOrIdent {
  1197. TNodePtr Expr;
  1198. TString Ident;
  1199. };
  1200. TMaybe<TExprOrIdent> BuildLiteralTypedSmartStringOrId(TContext& ctx, const TString& value);
  1201. TNodePtr BuildLiteralRawString(TPosition pos, const TString& value, bool isUtf8 = false);
  1202. TNodePtr BuildLiteralBool(TPosition pos, bool value);
  1203. TNodePtr BuildEmptyAction(TPosition pos);
  1204. TNodePtr BuildTuple(TPosition pos, const TVector<TNodePtr>& exprs);
  1205. TNodePtr BuildStructure(TPosition pos, const TVector<TNodePtr>& exprs);
  1206. TNodePtr BuildStructure(TPosition pos, const TVector<TNodePtr>& exprsUnlabeled, const TVector<TNodePtr>& labels);
  1207. TNodePtr BuildOrderedStructure(TPosition pos, const TVector<TNodePtr>& exprsUnlabeled, const TVector<TNodePtr>& labels);
  1208. TNodePtr BuildListOfNamedNodes(TPosition pos, TVector<TNodePtr>&& exprs);
  1209. TNodePtr BuildArgPlaceholder(TPosition pos, const TString& name);
  1210. TNodePtr BuildColumn(TPosition pos, const TString& column = TString(), const TString& source = TString());
  1211. TNodePtr BuildColumn(TPosition pos, const TNodePtr& column, const TString& source = TString());
  1212. TNodePtr BuildColumn(TPosition pos, const TDeferredAtom& column, const TString& source = TString());
  1213. TNodePtr BuildColumnOrType(TPosition pos, const TString& column = TString());
  1214. TNodePtr BuildAccess(TPosition pos, const TVector<INode::TIdPart>& ids, bool isLookup);
  1215. TNodePtr BuildMatchRecognizeVarAccess(TPosition pos, const TString& var, const TString& column, bool theSameVar);
  1216. TNodePtr BuildBind(TPosition pos, const TString& module, const TString& alias);
  1217. TNodePtr BuildLambda(TPosition pos, TNodePtr params, TNodePtr body, const TString& resName = TString());
  1218. TNodePtr BuildLambda(TPosition pos, TNodePtr params, const TVector<TNodePtr>& bodies);
  1219. TNodePtr BuildDataType(TPosition pos, const TString& typeName);
  1220. TMaybe<TString> LookupSimpleType(const TStringBuf& alias, bool flexibleTypes, bool isPgType);
  1221. TNodePtr BuildSimpleType(TContext& ctx, TPosition pos, const TString& typeName, bool dataOnly);
  1222. TNodePtr BuildIsNullOp(TPosition pos, TNodePtr a);
  1223. TNodePtr BuildBinaryOp(TContext& ctx, TPosition pos, const TString& opName, TNodePtr a, TNodePtr b);
  1224. TNodePtr BuildBinaryOpRaw(TPosition pos, const TString& opName, TNodePtr a, TNodePtr b);
  1225. TNodePtr BuildCalcOverWindow(TPosition pos, const TString& windowName, TNodePtr call);
  1226. TNodePtr BuildYsonOptionsNode(TPosition pos, bool autoConvert, bool strict, bool fastYson);
  1227. TNodePtr BuildDoCall(TPosition pos, const TNodePtr& node);
  1228. TNodePtr BuildTupleResult(TNodePtr tuple, size_t ensureTupleSize);
  1229. TNodePtr BuildNamedExprReference(TNodePtr parent, const TString& name, TMaybe<size_t> tupleIndex);
  1230. TNodePtr BuildNamedExpr(TNodePtr parent);
  1231. // Implemented in aggregation.cpp
  1232. TAggregationPtr BuildFactoryAggregation(TPosition pos, const TString& name, const TString& func, EAggregateMode aggMode, bool multi = false);
  1233. TAggregationPtr BuildKeyPayloadFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1234. TAggregationPtr BuildPayloadPredicateFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1235. TAggregationPtr BuildTwoArgsFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1236. TAggregationPtr BuildHistogramFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1237. TAggregationPtr BuildLinearHistogramFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1238. template <bool HasKey>
  1239. TAggregationPtr BuildTopFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1240. TAggregationPtr BuildTopFreqFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1241. TAggregationPtr BuildCountDistinctEstimateFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1242. TAggregationPtr BuildListFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1243. TAggregationPtr BuildPercentileFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1244. TAggregationPtr BuildCountAggregation(TPosition pos, const TString& name, const TString& func, EAggregateMode aggMode);
  1245. TAggregationPtr BuildUserDefinedFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1246. TAggregationPtr BuildPGFactoryAggregation(TPosition pos, const TString& name, EAggregateMode aggMode);
  1247. TAggregationPtr BuildNthFactoryAggregation(TPosition pos, const TString& name, const TString& factory, EAggregateMode aggMode);
  1248. // Implemented in builtin.cpp
  1249. TNodePtr BuildCallable(TPosition pos, const TString& module, const TString& name, const TVector<TNodePtr>& args, bool forReduce = false);
  1250. TNodePtr BuildUdf(TContext& ctx, TPosition pos, const TString& module, const TString& name, const TVector<TNodePtr>& args);
  1251. TNodePtr BuildBuiltinFunc(
  1252. TContext& ctx,
  1253. TPosition pos,
  1254. TString name,
  1255. const TVector<TNodePtr>& args,
  1256. const TString& nameSpace = TString(),
  1257. EAggregateMode aggMode = EAggregateMode::Normal,
  1258. bool* mustUseNamed = nullptr,
  1259. bool warnOnYqlNameSpace = true
  1260. );
  1261. // Implemented in query.cpp
  1262. TNodePtr BuildCreateUser(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TMaybe<TRoleParameters>& params, TScopedStatePtr scoped);
  1263. TNodePtr BuildCreateGroup(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TMaybe<TRoleParameters>& params, TScopedStatePtr scoped);
  1264. TNodePtr BuildAlterUser(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TRoleParameters& params, TScopedStatePtr scoped);
  1265. TNodePtr BuildRenameUser(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TDeferredAtom& newName, TScopedStatePtr scoped);
  1266. TNodePtr BuildAlterGroup(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TVector<TDeferredAtom>& toChange, bool isDrop,
  1267. TScopedStatePtr scoped);
  1268. TNodePtr BuildRenameGroup(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TDeferredAtom& newName, TScopedStatePtr scoped);
  1269. TNodePtr BuildDropRoles(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TVector<TDeferredAtom>& toDrop, bool isUser, bool missingOk, TScopedStatePtr scoped);
  1270. TNodePtr BuildGrantPermissions(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TVector<TDeferredAtom>& permissions, const TVector<TDeferredAtom>& schemaPaths, const TVector<TDeferredAtom>& roleName, TScopedStatePtr scoped);
  1271. TNodePtr BuildRevokePermissions(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TVector<TDeferredAtom>& permissions, const TVector<TDeferredAtom>& schemaPaths, const TVector<TDeferredAtom>& roleName, TScopedStatePtr scoped);
  1272. TNodePtr BuildUpsertObjectOperation(TPosition pos, const TString& objectId, const TString& typeId,
  1273. std::map<TString, TDeferredAtom>&& features, const TObjectOperatorContext& context);
  1274. TNodePtr BuildCreateObjectOperation(TPosition pos, const TString& objectId, const TString& typeId,
  1275. bool existingOk, bool replaceIfExists, std::map<TString, TDeferredAtom>&& features, const TObjectOperatorContext& context);
  1276. TNodePtr BuildAlterObjectOperation(TPosition pos, const TString& secretId, const TString& typeId,
  1277. std::map<TString, TDeferredAtom>&& features, std::set<TString>&& featuresToReset, const TObjectOperatorContext& context);
  1278. TNodePtr BuildDropObjectOperation(TPosition pos, const TString& secretId, const TString& typeId,
  1279. bool missingOk, std::map<TString, TDeferredAtom>&& options, const TObjectOperatorContext& context);
  1280. TNodePtr BuildCreateAsyncReplication(TPosition pos, const TString& id,
  1281. std::vector<std::pair<TString, TString>>&& targets,
  1282. std::map<TString, TNodePtr>&& settings,
  1283. const TObjectOperatorContext& context);
  1284. TNodePtr BuildAlterAsyncReplication(TPosition pos, const TString& id,
  1285. std::map<TString, TNodePtr>&& settings,
  1286. const TObjectOperatorContext& context);
  1287. TNodePtr BuildDropAsyncReplication(TPosition pos, const TString& id, bool cascade, const TObjectOperatorContext& context);
  1288. TNodePtr BuildWriteResult(TPosition pos, const TString& label, TNodePtr settings);
  1289. TNodePtr BuildCommitClusters(TPosition pos);
  1290. TNodePtr BuildRollbackClusters(TPosition pos);
  1291. TNodePtr BuildQuery(TPosition pos, const TVector<TNodePtr>& blocks, bool topLevel, TScopedStatePtr scoped, bool useSeq);
  1292. TNodePtr BuildPragma(TPosition pos, const TString& prefix, const TString& name, const TVector<TDeferredAtom>& values, bool valueDefault);
  1293. TNodePtr BuildSqlLambda(TPosition pos, TVector<TString>&& args, TVector<TNodePtr>&& exprSeq);
  1294. TNodePtr BuildWorldIfNode(TPosition pos, TNodePtr predicate, TNodePtr thenNode, TNodePtr elseNode, bool isEvaluate);
  1295. TNodePtr BuildWorldForNode(TPosition pos, TNodePtr list, TNodePtr bodyNode, TNodePtr elseNode, bool isEvaluate, bool isParallel);
  1296. TNodePtr BuildCreateTopic(TPosition pos, const TTopicRef& tr, const TCreateTopicParameters& params,
  1297. TScopedStatePtr scoped);
  1298. TNodePtr BuildAlterTopic(TPosition pos, const TTopicRef& tr, const TAlterTopicParameters& params,
  1299. TScopedStatePtr scoped);
  1300. TNodePtr BuildDropTopic(TPosition pos, const TTopicRef& topic, const TDropTopicParameters& params,
  1301. TScopedStatePtr scoped);
  1302. TNodePtr BuildCreateBackupCollection(
  1303. TPosition pos,
  1304. const TString& prefix,
  1305. const TString& id,
  1306. const TCreateBackupCollectionParameters& params,
  1307. const TObjectOperatorContext& context);
  1308. TNodePtr BuildAlterBackupCollection(
  1309. TPosition pos,
  1310. const TString& prefix,
  1311. const TString& id,
  1312. const TAlterBackupCollectionParameters& params,
  1313. const TObjectOperatorContext& context);
  1314. TNodePtr BuildDropBackupCollection(
  1315. TPosition pos,
  1316. const TString& prefix,
  1317. const TString& id,
  1318. const TDropBackupCollectionParameters& params,
  1319. const TObjectOperatorContext& context);
  1320. TNodePtr BuildBackup(
  1321. TPosition pos,
  1322. const TString& prefix,
  1323. const TString& id,
  1324. const TBackupParameters& params,
  1325. const TObjectOperatorContext& context);
  1326. TNodePtr BuildRestore(
  1327. TPosition pos,
  1328. const TString& prefix,
  1329. const TString& id,
  1330. const TRestoreParameters& params,
  1331. const TObjectOperatorContext& context);
  1332. template<class TContainer>
  1333. TMaybe<TString> FindMistypeIn(const TContainer& container, const TString& name) {
  1334. for (auto& item: container) {
  1335. if (NLevenshtein::Distance(name, item) < NYql::DefaultMistypeDistance) {
  1336. return item;
  1337. }
  1338. }
  1339. return {};
  1340. }
  1341. bool Parseui32(TNodePtr from, ui32& to);
  1342. TNodePtr GroundWithExpr(const TNodePtr& ground, const TNodePtr& expr);
  1343. const TString* DeriveCommonSourceName(const TVector<TNodePtr> &nodes);
  1344. } // namespace NSQLTranslationV1