sql_select.h 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma once
  2. #include "sql_translation.h"
  3. #include <yql/essentials/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h>
  4. namespace NSQLTranslationV1 {
  5. using namespace NSQLv1Generated;
  6. class TSqlSelect: public TSqlTranslation {
  7. public:
  8. TSqlSelect(TContext& ctx, NSQLTranslation::ESqlMode mode)
  9. : TSqlTranslation(ctx, mode)
  10. {
  11. }
  12. TSourcePtr Build(const TRule_select_stmt& node, TPosition& selectPos);
  13. TSourcePtr Build(const TRule_select_unparenthesized_stmt& node, TPosition& selectPos);
  14. private:
  15. bool SelectTerm(TVector<TNodePtr>& terms, const TRule_result_column& node);
  16. bool ValidateSelectColumns(const TVector<TNodePtr>& terms);
  17. bool ColumnName(TVector<TNodePtr>& keys, const TRule_column_name& node);
  18. bool ColumnName(TVector<TNodePtr>& keys, const TRule_without_column_name& node);
  19. template<typename TRule>
  20. bool ColumnList(TVector<TNodePtr>& keys, const TRule& node);
  21. bool NamedColumn(TVector<TNodePtr>& columnList, const TRule_named_column& node);
  22. TSourcePtr SingleSource(const TRule_single_source& node, const TVector<TString>& derivedColumns, TPosition derivedColumnsPos, bool unorderedSubquery);
  23. TSourcePtr NamedSingleSource(const TRule_named_single_source& node, bool unorderedSubquery);
  24. bool FlattenByArg(const TString& sourceLabel, TVector<TNodePtr>& flattenByColumns, TVector<TNodePtr>& flattenByExprs, const TRule_flatten_by_arg& node);
  25. TSourcePtr FlattenSource(const TRule_flatten_source& node);
  26. TSourcePtr JoinSource(const TRule_join_source& node);
  27. bool JoinOp(ISource* join, const TRule_join_source::TBlock3& block, TMaybe<TPosition> anyPos);
  28. TNodePtr JoinExpr(ISource*, const TRule_join_constraint& node);
  29. TSourcePtr ProcessCore(const TRule_process_core& node, const TWriteSettings& settings, TPosition& selectPos);
  30. TSourcePtr ReduceCore(const TRule_reduce_core& node, const TWriteSettings& settings, TPosition& selectPos);
  31. struct TSelectKindPlacement {
  32. bool IsFirstInSelectOp = false;
  33. bool IsLastInSelectOp = false;
  34. };
  35. TSourcePtr SelectCore(const TRule_select_core& node, const TWriteSettings& settings, TPosition& selectPos,
  36. TMaybe<TSelectKindPlacement> placement, TVector<TSortSpecificationPtr>& selectOpOrederBy, bool& selectOpAssumeOrderBy);
  37. bool WindowDefinition(const TRule_window_definition& node, TWinSpecs& winSpecs);
  38. bool WindowClause(const TRule_window_clause& node, TWinSpecs& winSpecs);
  39. struct TSelectKindResult {
  40. TSourcePtr Source;
  41. TWriteSettings Settings;
  42. TVector<TSortSpecificationPtr> SelectOpOrderBy;
  43. bool SelectOpAssumeOrderBy = false;
  44. TNodePtr SelectOpSkipTake;
  45. inline explicit operator bool() const {
  46. return static_cast<bool>(Source);
  47. }
  48. };
  49. bool ValidateLimitOrderByWithSelectOp(TMaybe<TSelectKindPlacement> placement, TStringBuf what);
  50. bool NeedPassLimitOrderByToUnderlyingSelect(TMaybe<TSelectKindPlacement> placement);
  51. template<typename TRule>
  52. TSourcePtr Build(const TRule& node, TPosition pos, TSelectKindResult&& first);
  53. TSelectKindResult SelectKind(const TRule_select_kind& node, TPosition& selectPos, TMaybe<TSelectKindPlacement> placement);
  54. TSelectKindResult SelectKind(const TRule_select_kind_partial& node, TPosition& selectPos, TMaybe<TSelectKindPlacement> placement);
  55. TSelectKindResult SelectKind(const TRule_select_kind_parenthesis& node, TPosition& selectPos, TMaybe<TSelectKindPlacement> placement);
  56. };
  57. } //namespace NSQLTranslationV1