Commit cdccae4
Changed files (2)
src/formatter.rs
@@ -148,13 +148,18 @@ fn format_select(select: &Select, indent_level: usize) -> String {
result.push_str(" DISTINCT");
}
- for (i, item) in select.projection.iter().enumerate() {
- if i == 0 {
- result.push('\n');
- } else {
- result.push_str(",\n");
+ if select.projection.len() == 1 && is_simple_projection(&select.projection[0]) {
+ result.push(' ');
+ result.push_str(&format_select_item(&select.projection[0]));
+ } else {
+ for (i, item) in select.projection.iter().enumerate() {
+ if i == 0 {
+ result.push('\n');
+ } else {
+ result.push_str(",\n");
+ }
+ result.push_str(&format!("{}{}", item_indent, format_select_item(item)));
}
- result.push_str(&format!("{}{}", item_indent, format_select_item(item)));
}
if !select.from.is_empty() {
@@ -182,7 +187,7 @@ fn format_select(select: &Select, indent_level: usize) -> String {
if let Some(selection) = &select.selection {
result.push('\n');
- result.push_str(&format!("{}WHERE {}", base_indent, format_expr(selection)));
+ result.push_str(&format!("{}WHERE {}", base_indent, format_where_expr(selection, indent_level + 2)));
}
match &select.group_by {
@@ -632,3 +637,32 @@ fn format_create_table(name: &ObjectName, columns: &[ColumnDef], indent_level: u
result.push_str(&format!("{})", " ".repeat(indent_level)));
result
}
+
+fn is_simple_projection(item: &SelectItem) -> bool {
+ match item {
+ SelectItem::UnnamedExpr(expr) => is_simple_expr(expr),
+ SelectItem::ExprWithAlias { expr, .. } => is_simple_expr(expr),
+ SelectItem::Wildcard(_) => true,
+ SelectItem::QualifiedWildcard(_, _) => true,
+ }
+}
+
+fn is_simple_expr(expr: &Expr) -> bool {
+ match expr {
+ Expr::Identifier(_) => true,
+ Expr::CompoundIdentifier(_) => true,
+ Expr::Value(_) => true,
+ _ => false,
+ }
+}
+
+fn format_where_expr(expr: &Expr, indent_level: usize) -> String {
+ match expr {
+ Expr::BinaryOp { left, op, right } if matches!(op, BinaryOperator::And) => {
+ let left_str = format_where_expr(left, indent_level);
+ let right_str = format_where_expr(right, indent_level);
+ format!("{}\n{}AND {}", left_str, " ".repeat(indent_level), right_str)
+ }
+ _ => format_expr(expr),
+ }
+}
Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "xlg-sqlfmt"
-version = "0.1.0"
+version = "0.1.1"
edition = "2024"
description = "A command-line SQL formatter that reads SQL from stdin and writes formatted SQL to stdout"
license = "MIT"