@@ -268,173 +268,6 @@ func TestParser(t *testing.T) {
268268 }
269269}
270270
271- // TestExplainVersionConsistency ensures all explain*.txt files have the same ClickHouse version header.
272- // This test:
273- // - Scans all explain*.txt files in testdata/
274- // - Checks each file for a "-- Generated by ClickHouse X.X.X.X" header
275- // - Skips files in test directories with parse_error, skip, or explain:false metadata
276- // - Reports files without version headers
277- // - Reports if multiple different versions are found
278- // - Passes only when all files have the same version header
279- func TestExplainVersionConsistency (t * testing.T ) {
280- testdataDir := "testdata"
281-
282- // Cache for metadata per test directory
283- metadataCache := make (map [string ]* testMetadata )
284- getMetadata := func (testDir string ) * testMetadata {
285- if meta , ok := metadataCache [testDir ]; ok {
286- return meta
287- }
288- metaPath := filepath .Join (testDir , "metadata.json" )
289- content , err := os .ReadFile (metaPath )
290- if err != nil {
291- metadataCache [testDir ] = nil
292- return nil
293- }
294- var meta testMetadata
295- if err := json .Unmarshal (content , & meta ); err != nil {
296- metadataCache [testDir ] = nil
297- return nil
298- }
299- metadataCache [testDir ] = & meta
300- return & meta
301- }
302-
303- // shouldSkipDir returns true if this test directory should be skipped for version checking
304- shouldSkipDir := func (testDir string ) bool {
305- meta := getMetadata (testDir )
306- if meta == nil {
307- return false
308- }
309- // Skip if parse_error (contains intentionally invalid SQL)
310- if meta .ParseError {
311- return true
312- }
313- // Skip if test is marked to skip entirely
314- if meta .Skip {
315- return true
316- }
317- // Skip if explain is explicitly disabled
318- if meta .Explain != nil && ! * meta .Explain {
319- return true
320- }
321- return false
322- }
323-
324- // shouldSkipFile returns true if this specific explain file should be skipped
325- // (e.g., it's in explain_todo)
326- shouldSkipFile := func (testDir , filename string ) bool {
327- meta := getMetadata (testDir )
328- if meta == nil || meta .ExplainTodo == nil {
329- return false
330- }
331- // Convert filename to statement key
332- // explain.txt -> stmt1, explain_2.txt -> stmt2, etc.
333- stmtKey := "stmt1"
334- if strings .HasPrefix (filename , "explain_" ) && strings .HasSuffix (filename , ".txt" ) {
335- numStr := strings .TrimSuffix (strings .TrimPrefix (filename , "explain_" ), ".txt" )
336- stmtKey = "stmt" + numStr
337- }
338- return meta .ExplainTodo [stmtKey ]
339- }
340-
341- // Find all explain*.txt files, skipping directories with parse_error/skip/explain:false
342- var explainFiles []string
343- var skippedDirs = make (map [string ]bool )
344- var skippedFiles int
345- err := filepath .Walk (testdataDir , func (path string , info os.FileInfo , err error ) error {
346- if err != nil {
347- return err
348- }
349- if ! info .IsDir () && strings .HasPrefix (info .Name (), "explain" ) && strings .HasSuffix (info .Name (), ".txt" ) {
350- testDir := filepath .Dir (path )
351- if shouldSkipDir (testDir ) {
352- skippedDirs [testDir ] = true
353- return nil
354- }
355- if shouldSkipFile (testDir , info .Name ()) {
356- skippedFiles ++
357- return nil
358- }
359- explainFiles = append (explainFiles , path )
360- }
361- return nil
362- })
363- if err != nil {
364- t .Fatalf ("Failed to walk testdata directory: %v" , err )
365- }
366-
367- if len (skippedDirs ) > 0 || skippedFiles > 0 {
368- t .Logf ("Skipped %d test directories with parse_error/skip/explain:false metadata, %d files in explain_todo" , len (skippedDirs ), skippedFiles )
369- }
370-
371- if len (explainFiles ) == 0 {
372- t .Skip ("No explain*.txt files found" )
373- }
374-
375- // Track versions and files without headers
376- versionToFiles := make (map [string ][]string )
377- var filesWithoutHeaders []string
378-
379- versionPattern := "-- Generated by ClickHouse "
380-
381- for _ , path := range explainFiles {
382- content , err := os .ReadFile (path )
383- if err != nil {
384- t .Errorf ("Failed to read %s: %v" , path , err )
385- continue
386- }
387-
388- lines := strings .Split (string (content ), "\n " )
389- if len (lines ) == 0 {
390- filesWithoutHeaders = append (filesWithoutHeaders , path )
391- continue
392- }
393-
394- firstLine := lines [0 ]
395- if ! strings .HasPrefix (firstLine , versionPattern ) {
396- filesWithoutHeaders = append (filesWithoutHeaders , path )
397- continue
398- }
399-
400- // Extract version from "-- Generated by ClickHouse X.X.X.X"
401- version := strings .TrimPrefix (firstLine , versionPattern )
402- versionToFiles [version ] = append (versionToFiles [version ], path )
403- }
404-
405- // Report findings
406- if len (filesWithoutHeaders ) > 0 {
407- t .Errorf ("Found %d files without version headers:" , len (filesWithoutHeaders ))
408- // Show first 10 files as examples
409- limit := 10
410- if len (filesWithoutHeaders ) < limit {
411- limit = len (filesWithoutHeaders )
412- }
413- for _ , path := range filesWithoutHeaders [:limit ] {
414- t .Errorf (" - %s" , path )
415- }
416- if len (filesWithoutHeaders ) > 10 {
417- t .Errorf (" ... and %d more" , len (filesWithoutHeaders )- 10 )
418- }
419- }
420-
421- if len (versionToFiles ) > 1 {
422- t .Errorf ("Found %d different ClickHouse versions:" , len (versionToFiles ))
423- for version , files := range versionToFiles {
424- t .Errorf (" Version %q: %d files" , version , len (files ))
425- }
426- }
427-
428- if len (filesWithoutHeaders ) > 0 || len (versionToFiles ) != 1 {
429- t .FailNow ()
430- }
431-
432- // Log the consistent version
433- for version := range versionToFiles {
434- t .Logf ("All %d explain files have consistent version: %s" , len (explainFiles ), version )
435- }
436- }
437-
438271// BenchmarkParser benchmarks the parser performance using a complex query
439272func BenchmarkParser (b * testing.B ) {
440273 query := `
0 commit comments