diff options
author | zhvv117 <[email protected]> | 2024-11-26 23:03:38 +0300 |
---|---|---|
committer | zhvv117 <[email protected]> | 2024-11-26 23:13:41 +0300 |
commit | 40f133ee2bbedc81d314e9804f0a39910489a3e6 (patch) | |
tree | e9a197896c5dca30340283149abcbbbc908b1a90 /yql/essentials/sql/v1 | |
parent | 60419ef1ed276c3a1f4269720382826a2b85e912 (diff) |
YQL-formatter improvements (part 1)
Список изменений:
1. Не делается перенос строки перед `WITH` с одним хинтом (например, перед `WITH TRUNCATE`).
2. Бинарные операторы ставятся в начале, а не конце строки.
3. Убрана лишняя пустая строка в конце файла.
4. Внутри выражений меняем `=` на `==` и `<>` на `!=`.
5. Улучшено форматирование комментариев.
6. Перечисление символов в `EXPORT` записывается в виде вертикально развёрнутого списка вместо одной длинной строки.
7. Убран отступ для блока `WITHOUT`.
commit_hash:a407628a023fbd1b9eb98eb41ac92b1ca1593298
Diffstat (limited to 'yql/essentials/sql/v1')
-rw-r--r-- | yql/essentials/sql/v1/format/sql_format.cpp | 296 | ||||
-rw-r--r-- | yql/essentials/sql/v1/format/sql_format_ut.h | 104 |
2 files changed, 188 insertions, 212 deletions
diff --git a/yql/essentials/sql/v1/format/sql_format.cpp b/yql/essentials/sql/v1/format/sql_format.cpp index 3cc18b141bb..7422b37a938 100644 --- a/yql/essentials/sql/v1/format/sql_format.cpp +++ b/yql/essentials/sql/v1/format/sql_format.cpp @@ -43,6 +43,17 @@ TTokenIterator SkipWSOrComment(TTokenIterator curr, TTokenIterator end) { return curr; } +TParsedToken TransformTokenForValidate(TParsedToken token) { + if (token.Name == "EQUALS2") { + token.Name = "EQUALS"; + token.Content = "="; + } else if (token.Name == "NOT_EQUALS2") { + token.Name = "NOT_EQUALS"; + token.Content = "!="; + } + return token; +} + bool Validate(const TParsedTokenList& query, const TParsedTokenList& formattedQuery) { auto in = query.begin(); auto out = formattedQuery.begin(); @@ -53,15 +64,17 @@ bool Validate(const TParsedTokenList& query, const TParsedTokenList& formattedQu in = SkipWS(in, inEnd); out = SkipWS(out, outEnd); if (in != inEnd && out != outEnd) { - if (in->Name != out->Name) { + auto inToken = TransformTokenForValidate(*in); + auto outToken = TransformTokenForValidate(*out); + if (inToken.Name != outToken.Name) { return false; } - if (IsProbablyKeyword(*in)) { - if (!AsciiEqualsIgnoreCase(in->Content, out->Content)) { + if (IsProbablyKeyword(inToken)) { + if (!AsciiEqualsIgnoreCase(inToken.Content, outToken.Content)) { return false; } } else { - if (in->Content != out->Content) { + if (inToken.Content != outToken.Content) { return false; } } @@ -456,14 +469,17 @@ public: MarkTokens(msg); Y_ENSURE(MarkTokenStack.empty()); Y_ENSURE(TokenIndex == ParsedTokens.size()); + TokenIndex = 0; Visit(msg); Y_ENSURE(TokenIndex == ParsedTokens.size()); Y_ENSURE(MarkTokenStack.empty()); + for (; LastComment < Comments.size(); ++LastComment) { const auto text = Comments[LastComment].Content; AddComment(text); } + addLine = AddLine.GetOrElse(true); return SB; @@ -508,17 +524,34 @@ private: } void NewLine() { + if (TokenIndex >= ParsedTokens.size() || ParsedTokens[TokenIndex].Line > LastLine) { + WriteComments(true); + } + if (OutColumn) { Out('\n'); } } void AddComment(TStringBuf text) { - if (text.StartsWith("--") && !SB.empty() && SB.back() == '-') { + if (!AfterComment && OutLine > BlockFirstLine && OutColumn == 0) { + Out('\n'); + } + AfterComment = true; + + if (!SB.empty() && SB.back() != ' ' && SB.back() != '\n') { Out(' '); } Out(text); + + if (!text.StartsWith("--") && + TokenIndex < ParsedTokens.size() && + Comments[LastComment].Line < ParsedTokens[TokenIndex].Line && + (LastComment + 1 >= Comments.size() || Comments[LastComment].Line < Comments[LastComment + 1].Line) + ) { + Out('\n'); + } } void MarkTokens(const NProtoBuf::Message& msg) { @@ -753,7 +786,6 @@ private: } void VisitPragma(const TRule_pragma_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); auto prefix = msg.GetRule_opt_id_prefix_or_type2(); @@ -776,44 +808,7 @@ private: } } - void PosFromPartial(const TRule_select_kind_partial& partial) { - const auto& kind = partial.GetRule_select_kind1(); - if (kind.HasBlock1()) { // DISCARD - PosFromToken(kind.GetBlock1().GetToken1()); - } else { - switch (kind.GetBlock2().Alt_case()) { - case TRule_select_kind_TBlock2::kAlt1: - PosFromToken(kind.GetBlock2().GetAlt1().GetRule_process_core1().GetToken1()); - break; - case TRule_select_kind_TBlock2::kAlt2: - PosFromToken(kind.GetBlock2().GetAlt2().GetRule_reduce_core1().GetToken1()); - break; - case TRule_select_kind_TBlock2::kAlt3: { - const auto& selCore = kind.GetBlock2().GetAlt3().GetRule_select_core1(); - if (selCore.HasBlock1()) { - PosFromToken(selCore.GetBlock1().GetToken1()); - } else { - PosFromToken(selCore.GetToken2()); - } - - break; - } - - default: - ythrow yexception() << "Alt is not supported"; - } - } - } - void VisitSelect(const TRule_select_stmt& msg) { - const auto& paren = msg.GetRule_select_kind_parenthesis1(); - if (paren.Alt_case() == TRule_select_kind_parenthesis::kAltSelectKindParenthesis1) { - const auto& partial = paren.GetAlt_select_kind_parenthesis1().GetRule_select_kind_partial1(); - PosFromPartial(partial); - } else { - PosFromToken(paren.GetAlt_select_kind_parenthesis2().GetToken1()); - } - NewLine(); Visit(msg.GetRule_select_kind_parenthesis1()); for (const auto& block : msg.GetBlock2()) { @@ -825,8 +820,6 @@ private: } void VisitSelectUnparenthesized(const TRule_select_unparenthesized_stmt& msg) { - const auto& partial = msg.GetRule_select_kind_partial1(); - PosFromPartial(partial); NewLine(); Visit(msg.GetRule_select_kind_partial1()); for (const auto& block : msg.GetBlock2()) { @@ -838,10 +831,11 @@ private: } void VisitNamedNodes(const TRule_named_nodes_stmt& msg) { - PosFromToken(msg.GetRule_bind_parameter_list1().GetRule_bind_parameter1().GetToken1()); NewLine(); Visit(msg.GetRule_bind_parameter_list1()); Visit(msg.GetToken2()); + ExprLineIndent = CurrentIndent; + switch (msg.GetBlock3().Alt_case()) { case TRule_named_nodes_stmt::TBlock3::kAlt1: { const auto& alt = msg.GetBlock3().GetAlt1(); @@ -884,10 +878,11 @@ private: default: ythrow yexception() << "Alt is not supported"; } + + ExprLineIndent = 0; } void VisitCreateTable(const TRule_create_table_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); Visit(msg.GetToken1()); Visit(msg.GetBlock2()); @@ -933,31 +928,26 @@ private: } void VisitDropTable(const TRule_drop_table_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_table_stmt::GetDescriptor(), msg); } void VisitAnalyze(const TRule_analyze_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_analyze_stmt::GetDescriptor(), msg); } void VisitBackup(const TRule_backup_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_backup_stmt::GetDescriptor(), msg); } void VisitRestore(const TRule_restore_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_restore_stmt::GetDescriptor(), msg); } void VisitUse(const TRule_use_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_use_stmt::GetDescriptor(), msg); } @@ -969,41 +959,16 @@ private: } void VisitIntoTable(const TRule_into_table_stmt& msg) { - switch (msg.GetBlock1().Alt_case()) { - case TRule_into_table_stmt_TBlock1::AltCase::kAlt1: - PosFromToken(msg.GetBlock1().GetAlt1().GetToken1()); - break; - case TRule_into_table_stmt_TBlock1::AltCase::kAlt2: - PosFromToken(msg.GetBlock1().GetAlt2().GetToken1()); - break; - case TRule_into_table_stmt_TBlock1::AltCase::kAlt3: - PosFromToken(msg.GetBlock1().GetAlt3().GetToken1()); - break; - case TRule_into_table_stmt_TBlock1::AltCase::kAlt4: - PosFromToken(msg.GetBlock1().GetAlt4().GetToken1()); - break; - case TRule_into_table_stmt_TBlock1::AltCase::kAlt5: - PosFromToken(msg.GetBlock1().GetAlt5().GetToken1()); - break; - case TRule_into_table_stmt_TBlock1::AltCase::kAlt6: - PosFromToken(msg.GetBlock1().GetAlt6().GetToken1()); - break; - default: - ythrow yexception() << "Alt is not supported"; - } - NewLine(); VisitAllFields(TRule_into_table_stmt::GetDescriptor(), msg); } void VisitCommit(const TRule_commit_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_commit_stmt::GetDescriptor(), msg); } void VisitUpdate(const TRule_update_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); Visit(msg.GetToken1()); Visit(msg.GetRule_simple_table_ref2()); @@ -1103,7 +1068,6 @@ private: } void VisitDelete(const TRule_delete_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); Visit(msg.GetToken1()); Visit(msg.GetToken2()); @@ -1129,31 +1093,39 @@ private: } void VisitRollback(const TRule_rollback_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_rollback_stmt::GetDescriptor(), msg); } void VisitDeclare(const TRule_declare_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_declare_stmt::GetDescriptor(), msg); } void VisitImport(const TRule_import_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_import_stmt::GetDescriptor(), msg); } void VisitExport(const TRule_export_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); - VisitAllFields(TRule_export_stmt::GetDescriptor(), msg); + VisitKeyword(msg.GetToken1()); + + NewLine(); + PushCurrentIndent(); + + const auto& list = msg.GetRule_bind_parameter_list2(); + Visit(list.GetRule_bind_parameter1()); + for (auto& b : list.GetBlock2()) { + Visit(b.GetToken1()); + NewLine(); + Visit(b.GetRule_bind_parameter2()); + } + + PopCurrentIndent(); } void VisitAlterTable(const TRule_alter_table_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); VisitKeyword(msg.GetToken2()); @@ -1171,13 +1143,11 @@ private: } void VisitAlterTableStore(const TRule_alter_table_store_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_alter_table_store_stmt::GetDescriptor(), msg); } void VisitAlterExternalTable(const TRule_alter_external_table_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); VisitKeyword(msg.GetToken2()); @@ -1196,7 +1166,6 @@ private: } void VisitDo(const TRule_do_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); switch (msg.GetBlock2().Alt_case()) { @@ -1230,7 +1199,6 @@ private: } void VisitAction(const TRule_define_action_or_subquery_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); VisitKeyword(msg.GetToken2()); @@ -1253,12 +1221,6 @@ private: } void VisitIf(const TRule_if_stmt& msg) { - if (msg.HasBlock1()) { - PosFromToken(msg.GetBlock1().GetToken1()); - } else { - PosFromToken(msg.GetToken2()); - } - NewLine(); if (msg.HasBlock1()) { Visit(msg.GetBlock1()); @@ -1281,14 +1243,6 @@ private: } void VisitFor(const TRule_for_stmt& msg) { - if (msg.HasBlock1()) { - PosFromToken(msg.GetBlock1().GetToken1()); - } else if (msg.HasBlock2()) { - PosFromToken(msg.GetBlock2().GetToken1()); - } else { - PosFromToken(msg.GetToken3()); - } - NewLine(); if (msg.HasBlock1()) { Visit(msg.GetBlock1()); @@ -1317,7 +1271,6 @@ private: } void VisitValues(const TRule_values_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); const auto& rowList = msg.GetRule_values_source_row_list2(); @@ -1334,73 +1287,61 @@ private: } void VisitGrantPermissions(const TRule_grant_permissions_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_grant_permissions_stmt::GetDescriptor(), msg); } void VisitRevokePermissions(const TRule_revoke_permissions_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_revoke_permissions_stmt::GetDescriptor(), msg); } void VisitCreateUser(const TRule_create_user_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_user_stmt::GetDescriptor(), msg); } void VisitAlterUser(const TRule_alter_user_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_alter_user_stmt::GetDescriptor(), msg); } void VisitCreateGroup(const TRule_create_group_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_group_stmt::GetDescriptor(), msg); } void VisitAlterGroup(const TRule_alter_group_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_alter_group_stmt::GetDescriptor(), msg); } void VisitDropRole(const TRule_drop_role_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_role_stmt::GetDescriptor(), msg); } void VisitUpsertObject(const TRule_upsert_object_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_upsert_object_stmt::GetDescriptor(), msg); } void VisitCreateObject(const TRule_create_object_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_object_stmt::GetDescriptor(), msg); } void VisitAlterObject(const TRule_alter_object_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_alter_object_stmt::GetDescriptor(), msg); } void VisitDropObject(const TRule_drop_object_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_object_stmt::GetDescriptor(), msg); } void VisitCreateTopic(const TRule_create_topic_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); VisitKeyword(msg.GetToken2()); @@ -1435,7 +1376,6 @@ private: } void VisitAlterTopic(const TRule_alter_topic_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitKeyword(msg.GetToken1()); VisitKeyword(msg.GetToken2()); @@ -1454,19 +1394,16 @@ private: } void VisitDropTopic(const TRule_drop_topic_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_topic_stmt::GetDescriptor(), msg); } void VisitCreateExternalDataSource(const TRule_create_external_data_source_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_external_data_source_stmt::GetDescriptor(), msg); } void VisitAlterExternalDataSource(const TRule_alter_external_data_source_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitToken(msg.GetToken1()); VisitToken(msg.GetToken2()); @@ -1487,49 +1424,41 @@ private: } void VisitDropExternalDataSource(const TRule_drop_external_data_source_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_external_data_source_stmt::GetDescriptor(), msg); } void VisitCreateView(const TRule_create_view_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_view_stmt::GetDescriptor(), msg); } void VisitDropView(const TRule_drop_view_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_view_stmt::GetDescriptor(), msg); } void VisitCreateAsyncReplication(const TRule_create_replication_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_replication_stmt::GetDescriptor(), msg); } void VisitAlterAsyncReplication(const TRule_alter_replication_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_alter_replication_stmt::GetDescriptor(), msg); } void VisitDropAsyncReplication(const TRule_drop_replication_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_replication_stmt::GetDescriptor(), msg); } void VisitCreateResourcePool(const TRule_create_resource_pool_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_resource_pool_stmt::GetDescriptor(), msg); } void VisitAlterResourcePool(const TRule_alter_resource_pool_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitToken(msg.GetToken1()); VisitToken(msg.GetToken2()); @@ -1549,19 +1478,16 @@ private: } void VisitDropResourcePool(const TRule_drop_resource_pool_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_resource_pool_stmt::GetDescriptor(), msg); } void VisitCreateBackupCollection(const TRule_create_backup_collection_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_backup_collection_stmt::GetDescriptor(), msg); } void VisitAlterBackupCollection(const TRule_alter_backup_collection_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitToken(msg.GetToken1()); Visit(msg.GetRule_backup_collection2()); @@ -1595,19 +1521,16 @@ private: } void VisitDropBackupCollection(const TRule_drop_backup_collection_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_backup_collection_stmt::GetDescriptor(), msg); } void VisitCreateResourcePoolClassifier(const TRule_create_resource_pool_classifier_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_create_resource_pool_classifier_stmt::GetDescriptor(), msg); } void VisitAlterResourcePoolClassifier(const TRule_alter_resource_pool_classifier_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitToken(msg.GetToken1()); VisitToken(msg.GetToken2()); @@ -1628,7 +1551,6 @@ private: } void VisitDropResourcePoolClassifier(const TRule_drop_resource_pool_classifier_stmt& msg) { - PosFromToken(msg.GetToken1()); NewLine(); VisitAllFields(TRule_drop_resource_pool_classifier_stmt::GetDescriptor(), msg); } @@ -1637,10 +1559,10 @@ private: VisitAllFieldsImpl<TPrettyVisitor, &TPrettyVisitor::Visit>(this, descr, msg); } - void WriteComments() { + void WriteComments(bool completeLine) { while (LastComment < Comments.size()) { const auto& c = Comments[LastComment]; - if (c.Line > LastLine || c.Line == LastLine && c.LinePos > LastColumn) { + if (c.Line > LastLine || !completeLine && c.Line == LastLine && c.LinePos > LastColumn) { break; } @@ -1652,13 +1574,7 @@ private: void PosFromToken(const TToken& token) { LastLine = token.GetLine(); LastColumn = token.GetColumn(); - WriteComments(); - } - - void PosFromParsedToken(const TParsedToken& token) { - LastLine = token.Line; - LastColumn = token.LinePos; - WriteComments(); + WriteComments(false); } void VisitToken(const TToken& token) { @@ -1713,6 +1629,7 @@ private: AfterQuestion = (str == "?"); AfterLess = (str == "<"); AfterKeyExpr = false; + AfterComment = false; if (forceKeyword) { str = to_upper(str); @@ -1737,9 +1654,22 @@ private: MarkTokenStack.pop_back(); } + if (InCondExpr) { + if (str == "=") { + str = "=="; + } else if (str == "<>") { + str = "!="; + } + } + Out(str); + + if (TokenIndex + 1 >= ParsedTokens.size() || ParsedTokens[TokenIndex + 1].Line > LastLine) { + WriteComments(true); + } + if (str == ";") { - Out('\n'); + NewLine(); } if (markedInfo.OpeningBracket) { @@ -1941,12 +1871,13 @@ private: Visit(msg.GetBlock7()); } + PopCurrentIndent(); + if (msg.HasBlock8()) { NewLine(); Visit(msg.GetBlock8()); } - PopCurrentIndent(); if (msg.HasBlock9()) { NewLine(); Visit(msg.GetBlock9()); @@ -2082,13 +2013,37 @@ private: } } + void VisitTableHints(const TRule_table_hints& msg) { + Visit(msg.GetToken1()); + const auto& block2 = msg.GetBlock2(); + if (block2.Alt_case() == TRule_table_hints::TBlock2::kAlt2) { + const auto& alt = block2.GetAlt2(); + + Visit(alt.GetToken1()); + + NewLine(); + PushCurrentIndent(); + + Visit(alt.GetRule_table_hint2()); + for (const auto& block : alt.GetBlock3()) { + Visit(block.GetToken1()); + NewLine(); + Visit(block.GetRule_table_hint2()); + } + + NewLine(); + PopCurrentIndent(); + + Visit(alt.GetToken4()); + } else { + Visit(block2); + } + } + void VisitSimpleTableRef(const TRule_simple_table_ref& msg) { Visit(msg.GetRule_simple_table_ref_core1()); if (msg.HasBlock2()) { - NewLine(); - PushCurrentIndent(); Visit(msg.GetBlock2()); - PopCurrentIndent(); } } @@ -2357,9 +2312,13 @@ private: } Visit(msg.GetToken3()); + ExprLineIndent = CurrentIndent; + Visit(msg.GetRule_expr4()); VisitRepeated(msg.GetBlock5()); + ExprLineIndent = 0; + PopCurrentIndent(); NewLine(); } @@ -2572,6 +2531,19 @@ private: VisitBinaryOp(orExpr.GetRule_or_subexpr1(), getOp, getExpr, orExpr.GetBlock2().begin(), orExpr.GetBlock2().end()); } + void VisitCondExpr(const TRule_cond_expr& msg) { + if (msg.Alt_case() == TRule_cond_expr::kAltCondExpr5) { + for (const auto& block : msg.GetAlt_cond_expr5().GetBlock1()) { + InCondExpr = true; + Visit(block.GetBlock1()); + InCondExpr = false; + Visit(block.GetRule_eq_subexpr2()); + } + } else { + VisitAllFields(TRule_cond_expr::GetDescriptor(), msg); + } + } + void VisitOrSubexpr(const TRule_or_subexpr& msg) { auto getExpr = [](const TRule_or_subexpr::TBlock2& b) -> const TRule_and_subexpr& { return b.GetRule_and_subexpr2(); }; auto getOp = [](const TRule_or_subexpr::TBlock2& b) -> const TToken& { return b.GetToken1(); }; @@ -2609,7 +2581,6 @@ private: const bool hasSecondNewline = ParsedTokens[TokenIndex].Line != ParsedTokens[TokenIndex + 2].Line; const ui32 currentOutLine = OutLine; - PosFromParsedToken(ParsedTokens[TokenIndex]); if (currentOutLine != OutLine || (hasFirstNewline && hasSecondNewline)) { NewLine(); if (!pushedIndent) { @@ -2619,7 +2590,6 @@ private: } Visit(alt.GetRule_double_question1()); - PosFromParsedToken(ParsedTokens[TokenIndex]); if (hasFirstNewline || hasSecondNewline) { NewLine(); if (!pushedIndent) { @@ -2701,8 +2671,8 @@ private: template <typename TExpr, typename TGetOp, typename TGetExpr, typename TIter> void VisitBinaryOp(const TExpr& expr, TGetOp getOp, TGetExpr getExpr, TIter begin, TIter end) { Visit(expr); - bool pushedIndent = false; + bool pushedIndent = false; for (; begin != end; ++begin) { const auto op = getOp(*begin); const auto opSize = BinaryOpTokenSize(op); @@ -2710,23 +2680,18 @@ private: const bool hasSecondNewline = ParsedTokens[TokenIndex].Line != ParsedTokens[TokenIndex + opSize].Line; const ui32 currentOutLine = OutLine; - PosFromParsedToken(ParsedTokens[TokenIndex]); - if (currentOutLine != OutLine || (hasFirstNewline && hasSecondNewline)) { + if (currentOutLine != OutLine || hasFirstNewline || hasSecondNewline) { NewLine(); - if (!pushedIndent) { + if (!pushedIndent && CurrentIndent == ExprLineIndent) { PushCurrentIndent(); pushedIndent = true; } } + Visit(op); - PosFromParsedToken(ParsedTokens[TokenIndex]); - if (hasFirstNewline || hasSecondNewline) { + if (hasFirstNewline && hasSecondNewline) { NewLine(); - if (!pushedIndent) { - PushCurrentIndent(); - pushedIndent = true; - } } Visit(getExpr(*begin)); @@ -2739,6 +2704,11 @@ private: void PushCurrentIndent() { CurrentIndent += OneIndent; + + BlockFirstLine = OutLine; + if (OutColumn > 0) { + ++BlockFirstLine; + } } void PopCurrentIndent() { @@ -2770,9 +2740,13 @@ private: bool AfterQuestion = false; bool AfterLess = false; bool AfterKeyExpr = false; + bool AfterComment = false; bool InMultiTokenOp = false; + bool InCondExpr = false; ui32 ForceExpandedLine = 0; ui32 ForceExpandedColumn = 0; + ui32 BlockFirstLine = 1; + i32 ExprLineIndent = 0; ui32 TokenIndex = 0; TMarkTokenStack MarkTokenStack; @@ -2826,6 +2800,7 @@ TStaticData::TStaticData() {TRule_single_source::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitSingleSource)}, {TRule_flatten_source::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitFlattenSource)}, {TRule_named_single_source::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitNamedSingleSource)}, + {TRule_table_hints::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitTableHints)}, {TRule_simple_table_ref::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitSimpleTableRef)}, {TRule_into_simple_table_ref::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitIntoSimpleTableRef)}, {TRule_select_kind_partial::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitSelectKindPartial)}, @@ -2853,6 +2828,7 @@ TStaticData::TStaticData() {TRule_ttl_tier_action::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitTtlTierAction)}, {TRule_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitExpr)}, + {TRule_cond_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitCondExpr)}, {TRule_or_subexpr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitOrSubexpr)}, {TRule_and_subexpr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAndSubexpr)}, {TRule_eq_subexpr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitEqSubexpr)}, diff --git a/yql/essentials/sql/v1/format/sql_format_ut.h b/yql/essentials/sql/v1/format/sql_format_ut.h index fc919b38c43..bed9e055abc 100644 --- a/yql/essentials/sql/v1/format/sql_format_ut.h +++ b/yql/essentials/sql/v1/format/sql_format_ut.h @@ -157,8 +157,8 @@ Y_UNIT_TEST(Rollback) { Y_UNIT_TEST(Export) { TCases cases = { - {"export $foo;","EXPORT $foo;\n"}, - {"export $foo, $bar;","EXPORT $foo, $bar;\n"}, + {"export $foo;","EXPORT\n\t$foo;\n"}, + {"export $foo, $bar;","EXPORT\n\t$foo,\n\t$bar;\n"}, }; TSetup setup; @@ -566,13 +566,13 @@ Y_UNIT_TEST(DefineActionOrSubquery) { Y_UNIT_TEST(If) { TCases cases = { {"evaluate if 1=1 do $a()", - "EVALUATE IF 1 = 1\n\tDO $a();\n"}, + "EVALUATE IF 1 == 1\n\tDO $a();\n"}, {"evaluate if 1=1 do $a() else do $b()", - "EVALUATE IF 1 = 1\n\tDO $a()\nELSE\n\tDO $b();\n"}, + "EVALUATE IF 1 == 1\n\tDO $a()\nELSE\n\tDO $b();\n"}, {"evaluate if 1=1 do begin select 1; end do", - "EVALUATE IF 1 = 1\n\tDO BEGIN\n\t\tSELECT\n\t\t\t1;\n\tEND DO;\n"}, + "EVALUATE IF 1 == 1\n\tDO BEGIN\n\t\tSELECT\n\t\t\t1;\n\tEND DO;\n"}, {"evaluate if 1=1 do begin select 1; end do else do begin select 2; end do", - "EVALUATE IF 1 = 1\n\tDO BEGIN\n\t\tSELECT\n\t\t\t1;\n\tEND DO\n" + "EVALUATE IF 1 == 1\n\tDO BEGIN\n\t\tSELECT\n\t\t\t1;\n\tEND DO\n" "ELSE\n\tDO BEGIN\n\t\tSELECT\n\t\t\t2;\n\tEND DO;\n"}, }; @@ -623,7 +623,7 @@ Y_UNIT_TEST(Update) { {"update user set (x,y)=(select 1,2)", "UPDATE user\nSET\n(\n\tx,\n\ty\n) = (\n\tSELECT\n\t\t1,\n\t\t2\n);\n"}, {"update user set x=1,y=2 where z=3", - "UPDATE user\nSET\n\tx = 1,\n\ty = 2\nWHERE z = 3;\n"}, + "UPDATE user\nSET\n\tx = 1,\n\ty = 2\nWHERE z == 3;\n"}, }; TSetup setup; @@ -635,7 +635,7 @@ Y_UNIT_TEST(Delete) { {"delete from user", "DELETE FROM user;\n"}, {"delete from user where 1=1", - "DELETE FROM user\nWHERE 1 = 1;\n"}, + "DELETE FROM user\nWHERE 1 == 1;\n"}, {"delete from user on select 1 as x, 2 as y", "DELETE FROM user\nON\nSELECT\n\t1 AS x,\n\t2 AS y;\n"}, {"delete from user on (x) values (1)", @@ -677,13 +677,13 @@ Y_UNIT_TEST(Into) { {"upsert into user erase by (x,y) values (1)", "UPSERT INTO user\n\tERASE BY (\n\t\tx,\n\t\ty\n\t)\nVALUES\n\t(1);\n"}, {"insert into user with truncate select 1 as x", - "INSERT INTO user\n\tWITH truncate\nSELECT\n\t1 AS x;\n"}, + "INSERT INTO user WITH truncate\nSELECT\n\t1 AS x;\n"}, {"insert into user with (truncate,inferscheme='1') select 1 as x", - "INSERT INTO user\n\tWITH (truncate, inferscheme = '1')\nSELECT\n\t1 AS x;\n"}, + "INSERT INTO user WITH (\n\ttruncate,\n\tinferscheme = '1'\n)\nSELECT\n\t1 AS x;\n"}, {"insert into user with schema Struct<user:int32> select 1 as user", - "INSERT INTO user\n\tWITH SCHEMA Struct<user: int32>\nSELECT\n\t1 AS user;\n"}, + "INSERT INTO user WITH SCHEMA Struct<user: int32>\nSELECT\n\t1 AS user;\n"}, {"insert into user with schema (int32 as user) select 1 as user", - "INSERT INTO user\n\tWITH SCHEMA (int32 AS user)\nSELECT\n\t1 AS user;\n"}, + "INSERT INTO user WITH SCHEMA (int32 AS user)\nSELECT\n\t1 AS user;\n"}, }; TSetup setup; @@ -699,7 +699,7 @@ Y_UNIT_TEST(Process) { {"process user,user using $f()", "PROCESS user, user\nUSING $f();\n"}, {"process user using $f() where 1=1 having 1=1 assume order by user", - "PROCESS user\nUSING $f()\nWHERE 1 = 1\nHAVING 1 = 1\nASSUME ORDER BY\n\tuser;\n"}, + "PROCESS user\nUSING $f()\nWHERE 1 == 1\nHAVING 1 == 1\nASSUME ORDER BY\n\tuser;\n"}, {"process user using $f() union all process user using $f()", "PROCESS user\nUSING $f()\nUNION ALL\nPROCESS user\nUSING $f();\n"}, {"process user using $f() with foo=bar", @@ -733,7 +733,7 @@ Y_UNIT_TEST(Reduce) { {"reduce user on user,user using $f()", "REDUCE user\nON\n\tuser,\n\tuser\nUSING $f();\n"}, {"reduce user on user using $f() where 1=1 having 1=1 assume order by user", - "REDUCE user\nON\n\tuser\nUSING $f()\nWHERE 1 = 1\nHAVING 1 = 1\nASSUME ORDER BY\n\tuser;\n"}, + "REDUCE user\nON\n\tuser\nUSING $f()\nWHERE 1 == 1\nHAVING 1 == 1\nASSUME ORDER BY\n\tuser;\n"}, {"reduce user presort user,user on user using $f();", "REDUCE user\nPRESORT\n\tuser,\n\tuser\nON\n\tuser\nUSING $f();\n"}, }; @@ -755,11 +755,11 @@ Y_UNIT_TEST(Select) { {"select a.*", "SELECT\n\ta.*;\n"}, {"select * without a", - "SELECT\n\t*\n\tWITHOUT\n\t\ta;\n"}, + "SELECT\n\t*\nWITHOUT\n\ta;\n"}, {"select * without a,b", - "SELECT\n\t*\n\tWITHOUT\n\t\ta,\n\t\tb;\n"}, + "SELECT\n\t*\nWITHOUT\n\ta,\n\tb;\n"}, {"select * without a,", - "SELECT\n\t*\n\tWITHOUT\n\t\ta,;\n"}, + "SELECT\n\t*\nWITHOUT\n\ta,;\n"}, {"select 1 from user", "SELECT\n\t1\nFROM user;\n"}, {"select 1 from plato.user", @@ -781,7 +781,7 @@ Y_UNIT_TEST(Select) { {"select 1 from user with user=user", "SELECT\n\t1\nFROM user\n\tWITH user = user;\n"}, {"select 1 from user with (user=user, user=user)", - "SELECT\n\t1\nFROM user\n\tWITH (user = user, user = user);\n"}, + "SELECT\n\t1\nFROM user\n\tWITH (\n\t\tuser = user,\n\t\tuser = user\n\t);\n"}, {"select 1 from user sample 0.1", "SELECT\n\t1\nFROM user\n\tSAMPLE 0.1;\n"}, {"select 1 from user tablesample system(0.1)", @@ -803,21 +803,21 @@ Y_UNIT_TEST(Select) { {"from user select 1", "FROM user\nSELECT\n\t1;\n"}, {"select * from user as a join user as b on a.x=b.y", - "SELECT\n\t*\nFROM user\n\tAS a\nJOIN user\n\tAS b\nON a.x = b.y;\n"}, + "SELECT\n\t*\nFROM user\n\tAS a\nJOIN user\n\tAS b\nON a.x == b.y;\n"}, {"select * from user as a join user as b using(x)", "SELECT\n\t*\nFROM user\n\tAS a\nJOIN user\n\tAS b\nUSING (x);\n"}, {"select * from any user as a full join user as b on a.x=b.y", - "SELECT\n\t*\nFROM ANY user\n\tAS a\nFULL JOIN user\n\tAS b\nON a.x = b.y;\n"}, + "SELECT\n\t*\nFROM ANY user\n\tAS a\nFULL JOIN user\n\tAS b\nON a.x == b.y;\n"}, {"select * from user as a left join any user as b on a.x=b.y", - "SELECT\n\t*\nFROM user\n\tAS a\nLEFT JOIN ANY user\n\tAS b\nON a.x = b.y;\n"}, + "SELECT\n\t*\nFROM user\n\tAS a\nLEFT JOIN ANY user\n\tAS b\nON a.x == b.y;\n"}, {"select * from any user as a right join any user as b on a.x=b.y", - "SELECT\n\t*\nFROM ANY user\n\tAS a\nRIGHT JOIN ANY user\n\tAS b\nON a.x = b.y;\n"}, + "SELECT\n\t*\nFROM ANY user\n\tAS a\nRIGHT JOIN ANY user\n\tAS b\nON a.x == b.y;\n"}, {"select * from user as a cross join user as b", "SELECT\n\t*\nFROM user\n\tAS a\nCROSS JOIN user\n\tAS b;\n"}, {"select 1 from user where key = 1", - "SELECT\n\t1\nFROM user\nWHERE key = 1;\n"}, + "SELECT\n\t1\nFROM user\nWHERE key == 1;\n"}, {"select 1 from user having count(*) = 1", - "SELECT\n\t1\nFROM user\nHAVING count(*) = 1;\n"}, + "SELECT\n\t1\nFROM user\nHAVING count(*) == 1;\n"}, {"select 1 from user group by key", "SELECT\n\t1\nFROM user\nGROUP BY\n\tkey;\n"}, {"select 1 from user group compact by key, value as v", @@ -860,7 +860,7 @@ Y_UNIT_TEST(CompositeTypesAndQuestions) { TCases cases = { {"declare $_x AS list<int32>??;declare $_y AS int32 ? ? ;select 1<>2, 1??2," "formattype(list<int32>), formattype(resource<user>),formattype(tuple<>), formattype(tuple< >), formattype(int32 ? ? )", - "DECLARE $_x AS list<int32>??;\nDECLARE $_y AS int32??;\n\nSELECT\n\t1 <> 2,\n\t1 ?? 2,\n\tformattype(list<int32>)," + "DECLARE $_x AS list<int32>??;\nDECLARE $_y AS int32??;\n\nSELECT\n\t1 != 2,\n\t1 ?? 2,\n\tformattype(list<int32>)," "\n\tformattype(resource<user>),\n\tformattype(tuple<>),\n\tformattype(tuple< >),\n\tformattype(int32??" ");\n" }, }; @@ -927,7 +927,7 @@ Y_UNIT_TEST(TableHints) { {"select * from plato.T with schema struct<foo:integer, Bar:list<string?>> where key<0", "SELECT\n\t*\nFROM plato.T\n\tWITH SCHEMA struct<foo: integer, Bar: list<string?>>\nWHERE key < 0;\n"}, {"select * from plato.T with (foo=bar, x=$y, a=(a, b, c), u='aaa', schema (foo int32, bar list<string>))", - "SELECT\n\t*\nFROM plato.T\n\tWITH (foo = bar, x = $y, a = (a, b, c), u = 'aaa', SCHEMA (foo int32, bar list<string>));\n"}, + "SELECT\n\t*\nFROM plato.T\n\tWITH (\n\t\tfoo = bar,\n\t\tx = $y,\n\t\ta = (a, b, c),\n\t\tu = 'aaa',\n\t\tSCHEMA (foo int32, bar list<string>)\n\t);\n"}, }; TSetup setup; @@ -947,7 +947,7 @@ Y_UNIT_TEST(BoolAsVariableName) { Y_UNIT_TEST(WithSchemaEquals) { TCases cases = { {"select * from plato.T with (format= csv_with_names, schema=(year int32 Null, month String, day String not null, a Utf8, b Uint16));", - "SELECT\n\t*\nFROM plato.T\n\tWITH (format = csv_with_names, SCHEMA = (year int32 NULL, month String, day String NOT NULL, a Utf8, b Uint16));\n"}, + "SELECT\n\t*\nFROM plato.T\n\tWITH (\n\t\tformat = csv_with_names,\n\t\tSCHEMA = (year int32 NULL, month String, day String NOT NULL, a Utf8, b Uint16)\n\t);\n"}, }; TSetup setup; @@ -1397,13 +1397,13 @@ Y_UNIT_TEST(Union) { Y_UNIT_TEST(CommentAfterLastSelect) { TCases cases = { {"SELECT 1--comment\n", - "SELECT\n\t1--comment\n;\n"}, + "SELECT\n\t1 --comment\n;\n"}, {"SELECT 1\n\n--comment\n", - "SELECT\n\t1--comment\n;\n"}, + "SELECT\n\t1 --comment\n;\n"}, {"SELECT 1\n\n--comment", - "SELECT\n\t1--comment\n;\n"}, + "SELECT\n\t1 --comment\n;\n"}, {"SELECT * FROM Input\n\n\n\n/* comment */\n\n\n", - "SELECT\n\t*\nFROM Input/* comment */;\n"}, + "SELECT\n\t*\nFROM Input /* comment */;\n"}, }; TSetup setup; @@ -1417,7 +1417,7 @@ Y_UNIT_TEST(WindowFunctionInsideExpr) { {"SELECT CAST(ROW_NUMBER() OVER (PARTITION BY key) AS String) AS x,\nFROM Input;", "SELECT\n\tCAST(\n\t\tROW_NUMBER() OVER (\n\t\t\tPARTITION BY\n\t\t\t\tkey\n\t\t) AS String\n\t) AS x,\nFROM Input;\n"}, {"SELECT CAST(ROW_NUMBER() OVER (users) AS String) AS x,\nFROM Input;", - "SELECT\n\tCAST(\n\t\tROW_NUMBER() OVER (\n\t\t\tusers\n\t\t) AS String\n\t) AS x,\nFROM Input;\n"}, + "SELECT\n\tCAST(\n\t\tROW_NUMBER() OVER (\n\t\t\tusers\n\t\t) AS String\n\t) AS x,\nFROM Input;\n"}, }; TSetup setup; @@ -1464,12 +1464,12 @@ Y_UNIT_TEST(MultiTokenOperations) { TCases cases = { {"$x = 1 >>| 2;", "$x = 1 >>| 2;\n"}, - {"$x = 1 >> 2;", + {"$x = 1 >> 2;", "$x = 1 >> 2;\n"}, - {"$x = 1 ?? 2;", + {"$x = 1 ?? 2;", "$x = 1 ?? 2;\n"}, - {"$x = 1 > /*comment*/ > /*comment*/ | 2;", - "$x = 1 >/*comment*/>/*comment*/| 2;\n"}, + {"$x = 1 > /*comment*/ > /*comment*/ | 2;", + "$x = 1 > /*comment*/> /*comment*/| 2;\n"}, }; TSetup setup; @@ -1481,27 +1481,27 @@ Y_UNIT_TEST(OperatorNewlines) { {"$x = TRUE\nOR\nFALSE;", "$x = TRUE\n\tOR\n\tFALSE;\n"}, {"$x = TRUE OR\nFALSE;", - "$x = TRUE OR\n\tFALSE;\n"}, + "$x = TRUE\n\tOR FALSE;\n"}, {"$x = TRUE\nOR FALSE;", - "$x = TRUE OR\n\tFALSE;\n"}, - {"$x = 1\n+2\n*3;", - "$x = 1 +\n\t2 *\n\t\t3;\n"}, + "$x = TRUE\n\tOR FALSE;\n"}, + {"$x = 1+\n2*\n3;", + "$x = 1\n\t+ 2\n\t* 3;\n"}, {"$x = 1\n+\n2\n*3\n*5\n+\n4;", - "$x = 1\n\t+\n\t2 *\n\t\t3 *\n\t\t5\n\t+\n\t4;\n"}, + "$x = 1\n\t+\n\t2\n\t* 3\n\t* 5\n\t+\n\t4;\n"}, {"$x = 1\n+2+3+4\n+5+6+7+\n\n8+9+10;", - "$x = 1 +\n\t2 + 3 + 4 +\n\t5 + 6 + 7 +\n\t8 + 9 + 10;\n"}, + "$x = 1\n\t+ 2 + 3 + 4\n\t+ 5 + 6 + 7\n\t+ 8 + 9 + 10;\n"}, {"$x = TRUE\nAND\nTRUE OR\nFALSE\nAND TRUE\nOR FALSE\nAND TRUE\nOR FALSE;", - "$x = TRUE\n\tAND\n\tTRUE OR\n\tFALSE AND\n\t\tTRUE OR\n\tFALSE AND\n\t\tTRUE OR\n\tFALSE;\n"}, + "$x = TRUE\n\tAND\n\tTRUE\n\tOR FALSE\n\tAND TRUE\n\tOR FALSE\n\tAND TRUE\n\tOR FALSE;\n"}, {"$x = 1 -- comment\n+ 2;", - "$x = 1-- comment\n\t+\n\t2;\n"}, - {"$x = 1 -- comment\n+ -- comment\n2;", - "$x = 1-- comment\n\t+-- comment\n\t2;\n"}, - {"$x = 1 + -- comment\n2;", - "$x = 1 +-- comment\n\t2;\n"}, - {"$x = 1\n>\n>\n|\n2;", + "$x = 1 -- comment\n\t+ 2;\n"}, + {"$x = 1 -- comment\n+ -- comment\n2;", + "$x = 1 -- comment\n\t+ -- comment\n\t2;\n"}, + {"$x = 1 + -- comment\n2;", + "$x = 1\n\t+ -- comment\n\t2;\n"}, + {"$x = 1\n>\n>\n|\n2;", "$x = 1\n\t>>|\n\t2;\n"}, - {"$x = 1\n?? 2 ??\n3\n??\n4 +\n5\n*\n6 +\n7 ??\n8;", - "$x = 1 ??\n\t2 ??\n\t3\n\t??\n\t4 +\n\t\t5\n\t\t\t*\n\t\t\t6 +\n\t\t7 ??\n\t8;\n"}, + {"$x = 1\n?? 2 ??\n3\n??\n4 +\n5\n*\n6 +\n7 ??\n8;", + "$x = 1 ??\n\t2 ??\n\t3\n\t??\n\t4\n\t+ 5\n\t*\n\t6\n\t+ 7 ??\n\t8;\n"}, }; TSetup setup; @@ -1531,7 +1531,7 @@ Y_UNIT_TEST(ObfuscateSelect) { {"declare $a as int32;", "DECLARE $id AS int32;\n"}, {"select * from `logs/of/bob` where pwd='foo';", - "SELECT\n\t*\nFROM id\nWHERE id = 'str';\n"}, + "SELECT\n\t*\nFROM id\nWHERE id == 'str';\n"}, {"select $f();", "SELECT\n\t$id();\n"}, }; |