Skip to content

Commit 49cbb1f

Browse files
authored
Enable 227 format roundtrip tests by adding missing Format support (#63)
1 parent 99db884 commit 49cbb1f

234 files changed

Lines changed: 597 additions & 377 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ast/ast.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ func (s *SelectWithUnionQuery) statementNode() {}
4343

4444
// SelectIntersectExceptQuery represents SELECT ... INTERSECT/EXCEPT ... queries.
4545
type SelectIntersectExceptQuery struct {
46-
Position token.Position `json:"-"`
47-
Selects []Statement `json:"selects"`
46+
Position token.Position `json:"-"`
47+
Selects []Statement `json:"selects"`
48+
Operators []string `json:"operators,omitempty"` // "INTERSECT", "EXCEPT", etc. for each operator between selects
4849
}
4950

5051
func (s *SelectIntersectExceptQuery) Pos() token.Position { return s.Position }

internal/format/expressions.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ func formatLiteral(sb *strings.Builder, lit *ast.Literal) {
7979
switch lit.Type {
8080
case ast.LiteralString:
8181
sb.WriteString("'")
82-
// Escape single quotes in the string
82+
// Escape backslashes and single quotes in the string
8383
s := lit.Value.(string)
84+
s = strings.ReplaceAll(s, `\`, `\\`)
8485
s = strings.ReplaceAll(s, "'", "''")
8586
sb.WriteString(s)
8687
sb.WriteString("'")
@@ -289,6 +290,11 @@ func formatBinaryExpr(sb *strings.Builder, expr *ast.BinaryExpr) {
289290
// formatUnaryExpr formats a unary expression.
290291
func formatUnaryExpr(sb *strings.Builder, expr *ast.UnaryExpr) {
291292
sb.WriteString(expr.Op)
293+
// Add space after word operators like NOT
294+
op := strings.ToUpper(expr.Op)
295+
if op == "NOT" {
296+
sb.WriteString(" ")
297+
}
292298
Expression(sb, expr.Operand)
293299
}
294300

internal/format/format.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func Statement(sb *strings.Builder, stmt ast.Statement) {
6767
formatDetachQuery(sb, s)
6868
case *ast.AttachQuery:
6969
formatAttachQuery(sb, s)
70+
case *ast.ShowPrivilegesQuery:
71+
formatShowPrivilegesQuery(sb, s)
72+
case *ast.ShowCreateQuotaQuery:
73+
formatShowCreateQuotaQuery(sb, s)
7074
default:
7175
// Fallback for unhandled statements
7276
}

internal/format/statements.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,15 @@ func formatOrderByElement(sb *strings.Builder, o *ast.OrderByElement) {
369369
func formatSelectIntersectExceptQuery(sb *strings.Builder, q *ast.SelectIntersectExceptQuery) {
370370
for i, sel := range q.Selects {
371371
if i > 0 {
372-
sb.WriteString(" ")
372+
// Get the operator between selects (operators[i-1] corresponds to the operator before selects[i])
373+
opIdx := i - 1
374+
if opIdx < len(q.Operators) {
375+
sb.WriteString(" ")
376+
sb.WriteString(q.Operators[opIdx])
377+
sb.WriteString(" ")
378+
} else {
379+
sb.WriteString(" ")
380+
}
373381
}
374382
Statement(sb, sel)
375383
}
@@ -1084,3 +1092,23 @@ func formatAttachQuery(sb *strings.Builder, q *ast.AttachQuery) {
10841092
}
10851093
sb.WriteString(q.Table)
10861094
}
1095+
1096+
// formatShowPrivilegesQuery formats a SHOW PRIVILEGES statement.
1097+
func formatShowPrivilegesQuery(sb *strings.Builder, q *ast.ShowPrivilegesQuery) {
1098+
if q == nil {
1099+
return
1100+
}
1101+
sb.WriteString("SHOW PRIVILEGES")
1102+
}
1103+
1104+
// formatShowCreateQuotaQuery formats a SHOW CREATE QUOTA statement.
1105+
func formatShowCreateQuotaQuery(sb *strings.Builder, q *ast.ShowCreateQuotaQuery) {
1106+
if q == nil {
1107+
return
1108+
}
1109+
sb.WriteString("SHOW CREATE QUOTA")
1110+
if q.Name != "" {
1111+
sb.WriteString(" ")
1112+
sb.WriteString(q.Name)
1113+
}
1114+
}

0 commit comments

Comments
 (0)