formatSQL formats a SQL string
(sql string)
| 203 | |
| 204 | // formatSQL formats a SQL string |
| 205 | func (f *Formatter) formatSQL(sql string) (string, error) { |
| 206 | // Use pooled tokenizer for performance |
| 207 | tkz := tokenizer.GetTokenizer() |
| 208 | defer tokenizer.PutTokenizer(tkz) |
| 209 | |
| 210 | // Tokenize the SQL |
| 211 | tokens, err := tkz.Tokenize([]byte(sql)) |
| 212 | if err != nil { |
| 213 | return "", fmt.Errorf("tokenization failed: %w", err) |
| 214 | } |
| 215 | |
| 216 | if len(tokens) == 0 { |
| 217 | return "", nil |
| 218 | } |
| 219 | |
| 220 | // Convert tokens for parser using centralized converter |
| 221 | |
| 222 | // Parse to AST with proper error handling for memory management |
| 223 | p := parser.NewParser() |
| 224 | parsedAST, err := p.ParseFromModelTokens(tokens) |
| 225 | if err != nil { |
| 226 | // Parser failed, no AST to release |
| 227 | return "", fmt.Errorf("parsing failed: %w", err) |
| 228 | } |
| 229 | |
| 230 | // CRITICAL: Always release AST, even on formatting errors |
| 231 | defer func() { |
| 232 | ast.ReleaseAST(parsedAST) |
| 233 | }() |
| 234 | |
| 235 | // Configure formatter options |
| 236 | indentStr := strings.Repeat(" ", f.Opts.IndentSize) |
| 237 | formatterOpts := FormatterOptions{ |
| 238 | Indent: indentStr, |
| 239 | Compact: f.Opts.Compact, |
| 240 | UppercaseKw: f.Opts.Uppercase, |
| 241 | AlignColumns: !f.Opts.Compact, // Align columns unless in compact mode |
| 242 | } |
| 243 | |
| 244 | // Create formatter and format the AST |
| 245 | formatter := NewSQLFormatter(formatterOpts) |
| 246 | formatted, err := formatter.Format(parsedAST) |
| 247 | if err != nil { |
| 248 | return "", fmt.Errorf("formatting failed: %w", err) |
| 249 | } |
| 250 | |
| 251 | return formatted, nil |
| 252 | } |
| 253 | |
| 254 | // FormatterFlags represents CLI flags for formatter command |
| 255 | type FormatterFlags struct { |
no test coverage detected