node.h 58 KB

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