TestSQLFormatter_WindowFunctions tests window function formatting
(t *testing.T)
| 234 | |
| 235 | // TestSQLFormatter_WindowFunctions tests window function formatting |
| 236 | func TestSQLFormatter_WindowFunctions(t *testing.T) { |
| 237 | tests := []struct { |
| 238 | name string |
| 239 | sql string |
| 240 | expectWords []string |
| 241 | }{ |
| 242 | { |
| 243 | name: "ROW_NUMBER with OVER", |
| 244 | sql: "SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) as rank FROM employees", |
| 245 | expectWords: []string{"select", "over", "order by"}, |
| 246 | }, |
| 247 | { |
| 248 | name: "RANK with PARTITION BY", |
| 249 | sql: "SELECT dept, name, RANK() OVER (PARTITION BY dept ORDER BY salary) FROM employees", |
| 250 | expectWords: []string{"select", "over", "partition by", "order by"}, |
| 251 | }, |
| 252 | { |
| 253 | name: "Window frame", |
| 254 | sql: "SELECT date, SUM(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) FROM transactions", |
| 255 | expectWords: []string{"select", "over", "order by", "rows", "between"}, |
| 256 | }, |
| 257 | } |
| 258 | |
| 259 | for _, tt := range tests { |
| 260 | t.Run(tt.name, func(t *testing.T) { |
| 261 | tkz := tokenizer.GetTokenizer() |
| 262 | defer tokenizer.PutTokenizer(tkz) |
| 263 | |
| 264 | tokens, err := tkz.Tokenize([]byte(tt.sql)) |
| 265 | if err != nil { |
| 266 | t.Fatalf("Tokenization failed: %v", err) |
| 267 | } |
| 268 | |
| 269 | p := parser.NewParser() |
| 270 | astObj := ast.NewAST() |
| 271 | defer ast.ReleaseAST(astObj) |
| 272 | |
| 273 | result, err := p.ParseFromModelTokens(tokens) |
| 274 | if err != nil { |
| 275 | t.Skipf("Parsing failed (may not be supported yet): %v", err) |
| 276 | return |
| 277 | } |
| 278 | astObj.Statements = result.Statements |
| 279 | |
| 280 | formatter := NewSQLFormatter(FormatterOptions{ |
| 281 | Indent: " ", |
| 282 | UppercaseKw: false, |
| 283 | }) |
| 284 | |
| 285 | output, err := formatter.Format(astObj) |
| 286 | if err != nil { |
| 287 | t.Fatalf("Formatting failed: %v", err) |
| 288 | } |
| 289 | |
| 290 | for _, word := range tt.expectWords { |
| 291 | if !strings.Contains(strings.ToLower(output), word) { |
| 292 | t.Errorf("Expected '%s' in output:\n%s", word, output) |
| 293 | } |
nothing calls this directly
no test coverage detected