Visitar URL original
Sync Repos: Release 180.102.0 by allancascante · Pull Request #230 · microsoft/SqlScriptDOM · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add multiline query clause formatting options
  • Loading branch information
Allan Cascante
Allan Cascante committed Aug 27, 2026
commit ced33151a46d7d2e4986e3670d5b9ebd49d8133f
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ namespace Microsoft.SqlServer.TransactSql.ScriptDom.ScriptGenerator
{
partial class SqlScriptGeneratorVisitor
{
private Boolean? _multilinePredicates;

public override void ExplicitVisit(BooleanBinaryExpression node)
{
AlignmentPoint start = new AlignmentPoint();
Expand All @@ -35,12 +37,27 @@ private Boolean RightPredicateOnNewline(BooleanBinaryExpression node)
// * A Newline was inserted before the WHERE clause, AND
// * The Binary Expression is an AND or an OR expression.
Boolean insertNewline =
_options.MultilineWherePredicatesList &&
_options.NewLineBeforeWhereClause &&
(_multilinePredicates ??
(_options.MultilineWherePredicatesList && _options.NewLineBeforeWhereClause)) &&
(node.BinaryExpressionType == BooleanBinaryExpressionType.And || node.BinaryExpressionType == BooleanBinaryExpressionType.Or);

return insertNewline;
}

private void GeneratePredicate(TSqlFragment predicate, Boolean multiline)
{
Boolean? previousMultilinePredicates = _multilinePredicates;
_multilinePredicates = multiline;

try
{
GenerateFragmentIfNotNull(predicate);
}
finally
{
_multilinePredicates = previousMultilinePredicates;
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,14 @@ public override void ExplicitVisit(GroupByClause node)
GenerateSpace();
}

GenerateCommaSeparatedList(node.GroupingSpecifications);
if (_options.MultilineGroupByElementsList)
{
GenerateAlignedMultilineCommaSeparatedList(node.GroupingSpecifications);
}
else
{
GenerateCommaSeparatedList(node.GroupingSpecifications);
}
}

if (node.GroupByOption != GroupByOption.None)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ public override void ExplicitVisit(HavingClause node)
AlignmentPoint clauseBody = GetAlignmentPointForFragment(node, ClauseBody);
if (GenerateClauseBodyStart(_options.NewLineBeforeHavingClause, clauseBody))
{
GenerateFragmentIfNotNull(node.SearchCondition);
GeneratePredicate(node.SearchCondition, _options.MultilineHavingPredicatesList);
}
else
{
GenerateSpaceAndFragmentIfNotNull(node.SearchCondition);
GenerateSpace();
GeneratePredicate(node.SearchCondition, _options.MultilineHavingPredicatesList);
}

PopAlignmentPoint();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,14 @@ public override void ExplicitVisit(OrderByClause node)
GenerateSpace();
}

GenerateCommaSeparatedList(node.OrderByElements);
if (_options.MultilineOrderByElementsList)
{
GenerateAlignedMultilineCommaSeparatedList(node.OrderByElements);
}
else
{
GenerateCommaSeparatedList(node.OrderByElements);
}
}

PopAlignmentPoint();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,14 @@ public override void ExplicitVisit(OverClause node)
GenerateSpaceAndKeyword(TSqlTokenType.By);

GenerateSpace();
GenerateCommaSeparatedList(node.Partitions);
if (_options.MultilinePartitionByElementsList)
{
GenerateAlignedMultilineCommaSeparatedList(node.Partitions);
}
else
{
GenerateCommaSeparatedList(node.Partitions);
}
}

if (node.OrderByClause != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,41 @@ protected void GenerateCommaSeparatedList<T>(IList<T> list, Boolean insertNewLin
});
}

// generate a multiline comma-separated list whose elements remain aligned when commas lead
protected void GenerateAlignedMultilineCommaSeparatedList<T>(IList<T> list) where T : TSqlFragment
{
if (list == null)
{
return;
}

Boolean first = true;
Boolean leadingComma = _options.CommaPlacement == CommaPlacement.Leading;
AlignmentPoint elements = new AlignmentPoint();

foreach (T fragment in list)
{
if (!first)
{
if (leadingComma)
{
NewLine();
GenerateRightAlignedCommaSeparator();
}
else
{
GenerateSymbol(TSqlTokenType.Comma);
NewLine();
}
}

MarkAndPushAlignmentPoint(elements);
GenerateFragmentIfNotNull(fragment);
PopAlignmentPoint();
first = false;
}
}

// generate a comma-separated list
protected void GenerateCommaSeparatedList<T>(IList<T> list, bool insertNewLine, bool indent, bool generateSpaces = true) where T : TSqlFragment
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ public override void ExplicitVisit(WhereClause node)

if (node.SearchCondition != null)
{
bool multilinePredicates = _options.MultilineWherePredicatesList && _options.NewLineBeforeWhereClause;

if (indented)
{
GenerateFragmentIfNotNull(node.SearchCondition);
GeneratePredicate(node.SearchCondition, multilinePredicates);
}
else
{
GenerateSpaceAndFragmentIfNotNull(node.SearchCondition);
GenerateSpace();
GeneratePredicate(node.SearchCondition, multilinePredicates);
}
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@ public override void ExplicitVisit(WindowDefinition node)
GenerateSpaceAndKeyword(TSqlTokenType.By);

GenerateSpace();
GenerateCommaSeparatedList(node.Partitions);
if (_options.MultilinePartitionByElementsList)
{
GenerateAlignedMultilineCommaSeparatedList(node.Partitions);
}
else
{
GenerateCommaSeparatedList(node.Partitions);
}
}

if (node.OrderByClause != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,18 @@
<Setting name="MultilineWherePredicatesList" type="bool" default="true">
<Summary>Gets or sets a boolean indicating if WHERE predicates (expressions separated by AND, and OR) should be written on multiple lines</Summary>
</Setting>
<Setting name="MultilineGroupByElementsList" type="bool" default="false">
<Summary>Gets or sets a boolean indicating if GROUP BY elements should be listed as a multi-line list</Summary>
</Setting>
<Setting name="MultilineHavingPredicatesList" type="bool" default="true">
<Summary>Gets or sets a boolean indicating if HAVING predicates (expressions separated by AND or OR) should be written on multiple lines</Summary>
</Setting>
<Setting name="MultilineOrderByElementsList" type="bool" default="false">
<Summary>Gets or sets a boolean indicating if ORDER BY elements should be listed as a multi-line list</Summary>
</Setting>
<Setting name="MultilinePartitionByElementsList" type="bool" default="false">
<Summary>Gets or sets a boolean indicating if PARTITION BY elements in window specifications should be listed as a multi-line list</Summary>
</Setting>
<Setting name="MultilineInValuesList" type="bool" default="false">
<Summary>Gets or sets a boolean indicating if the values in an IN (values) predicate should be listed as a multi-line list. When false, the IN list is written on a single line.</Summary>
</Setting>
Expand Down
Loading