node.h 59 KB

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