Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions parser/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,13 @@ go test ./parser/... -timeout 5s
```

The tests are very fast. If a test is timing out, it indicates a bug (likely an infinite loop in the parser).

## Checking Skipped Tests

After fixing parser issues, check if any skipped tests now pass:

```bash
go test ./parser -check-skipped -v 2>&1 | grep "PASSES NOW"
```

Tests that output `PASSES NOW` can have their `todo` flag removed from `metadata.json`. This helps identify when parser improvements fix multiple tests at once.
49 changes: 41 additions & 8 deletions parser/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package parser_test
import (
"context"
"encoding/json"
"flag"
"os"
"path/filepath"
"strings"
Expand All @@ -12,6 +13,10 @@ import (
"github.com/kyleconroy/doubleclick/parser"
)

// checkSkipped runs skipped todo tests to see which ones now pass.
// Use with: go test ./parser -check-skipped -v
var checkSkipped = flag.Bool("check-skipped", false, "Run skipped todo tests to see which ones now pass")

// testMetadata holds optional metadata for a test case
type testMetadata struct {
Todo bool `json:"todo,omitempty"`
Expand Down Expand Up @@ -87,15 +92,18 @@ func TestParser(t *testing.T) {
}
}

// Skip tests marked with skip: true
// Skip tests marked with skip: true (these cause infinite loops or other critical issues)
if metadata.Skip {
t.Skip("Skipping: skip is true in metadata")
}

// Skip tests where explain is explicitly false (e.g., ClickHouse couldn't parse it)
// Unless -check-skipped is set and the test is a todo test
if metadata.Explain != nil && !*metadata.Explain {
t.Skipf("Skipping: explain is false in metadata")
return
if !(*checkSkipped && metadata.Todo) {
t.Skipf("Skipping: explain is false in metadata")
return
}
}

// Parse the query
Expand All @@ -107,7 +115,11 @@ func TestParser(t *testing.T) {
return
}
if metadata.Todo {
t.Skipf("TODO: Parser does not yet support: %s (error: %v)", query, err)
if *checkSkipped {
t.Skipf("STILL FAILING (parse error): %v", err)
} else {
t.Skipf("TODO: Parser does not yet support: %s (error: %v)", query, err)
}
return
}
t.Fatalf("Parse error: %v\nQuery: %s", err, query)
Expand All @@ -122,7 +134,11 @@ func TestParser(t *testing.T) {

if len(stmts) == 0 {
if metadata.Todo {
t.Skipf("TODO: Parser returned no statements for: %s", query)
if *checkSkipped {
t.Skipf("STILL FAILING (no statements): parser returned no statements")
} else {
t.Skipf("TODO: Parser returned no statements for: %s", query)
}
return
}
t.Fatalf("Expected at least 1 statement, got 0\nQuery: %s", query)
Expand All @@ -132,7 +148,11 @@ func TestParser(t *testing.T) {
_, jsonErr := json.Marshal(stmts[0])
if jsonErr != nil {
if metadata.Todo {
t.Skipf("TODO: JSON serialization failed: %v", jsonErr)
if *checkSkipped {
t.Skipf("STILL FAILING (JSON serialization): %v", jsonErr)
} else {
t.Skipf("TODO: JSON serialization failed: %v", jsonErr)
}
return
}
t.Fatalf("JSON marshal error: %v\nQuery: %s", jsonErr, query)
Expand All @@ -150,7 +170,11 @@ func TestParser(t *testing.T) {
actual := strings.TrimSpace(parser.Explain(stmts[0]))
if actual != expected {
if metadata.Todo {
t.Skipf("TODO: Explain output mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expected, actual)
if *checkSkipped {
t.Skipf("STILL FAILING (explain mismatch):\nExpected:\n%s\n\nGot:\n%s", expected, actual)
} else {
t.Skipf("TODO: Explain output mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expected, actual)
}
return
}
t.Errorf("Explain output mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expected, actual)
Expand All @@ -165,12 +189,21 @@ func TestParser(t *testing.T) {
actualAST := strings.TrimSpace(string(actualASTBytes))
if actualAST != expectedAST {
if metadata.Todo {
t.Skipf("TODO: AST JSON mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expectedAST, actualAST)
if *checkSkipped {
t.Skipf("STILL FAILING (AST mismatch):\nExpected:\n%s\n\nGot:\n%s", expectedAST, actualAST)
} else {
t.Skipf("TODO: AST JSON mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expectedAST, actualAST)
}
return
}
t.Errorf("AST JSON mismatch\nQuery: %s\nExpected:\n%s\n\nGot:\n%s", query, expectedAST, actualAST)
}
}

// If we get here with a todo test and -check-skipped is set, the test passes!
if metadata.Todo && *checkSkipped {
t.Logf("PASSES NOW - can remove todo flag from: %s", entry.Name())
}
})
}
}
Expand Down
4 changes: 3 additions & 1 deletion parser/testdata/00053_all_inner_join/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00054_join_string/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00055_join_two_numbers/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00056_join_number_string/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00067_union_all/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00072_in_types/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00076_system_columns_bytes/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}

This file was deleted.

4 changes: 3 additions & 1 deletion parser/testdata/00139_like/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00169_contingency/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00169_join_constant_keys/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00173_group_by_use_nulls/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
1 change: 0 additions & 1 deletion parser/testdata/00175_if_num_arrays/metadata.json

This file was deleted.

4 changes: 3 additions & 1 deletion parser/testdata/00178_function_replicate/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00189_time_zones_long/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
1 change: 0 additions & 1 deletion parser/testdata/00198_group_by_empty_arrays/metadata.json

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00216_bit_test_function_family/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00232_format_readable_size/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00250_tuple_comparison/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00264_uniq_many_args/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00283_column_cut/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00291_array_reduce/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00296_url_parameters/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00328_long_case_construction/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
1 change: 0 additions & 1 deletion parser/testdata/00337_shard_any_heavy/metadata.json

This file was deleted.

4 changes: 3 additions & 1 deletion parser/testdata/00364_java_style_denormals/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00431_if_nulls/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00434_tonullable/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00436_convert_charset/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00552_logical_functions_simple/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00552_or_nullable/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00757_enum_defaults_const/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00759_kodieg/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00973_uniq_non_associativity/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00974_full_outer_join/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"todo": true, "parse_error": true}
{
"parse_error": true
}
4 changes: 3 additions & 1 deletion parser/testdata/00977_int_div/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00978_ml_math/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
4 changes: 3 additions & 1 deletion parser/testdata/00997_trim/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"explain":false,"todo": true}
{
"explain": false
}
Loading