From f3849a3e943e5f0871b89cadbee89051b2fdcaa1 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 23 Dec 2025 17:57:30 +0000 Subject: [PATCH] Add SHOW PRIVILEGES statement parsing Implement parsing for ClickHouse's SHOW PRIVILEGES statement by adding a new ShowPrivilegesQuery AST type with its own explain output format. --- ast/ast.go | 9 +++++++++ internal/explain/explain.go | 2 ++ parser/parser.go | 16 ++++++++++++---- .../testdata/01271_show_privileges/metadata.json | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index def0c2215..8fef5608e 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -620,6 +620,15 @@ func (e *ExistsQuery) Pos() token.Position { return e.Position } func (e *ExistsQuery) End() token.Position { return e.Position } func (e *ExistsQuery) statementNode() {} +// ShowPrivilegesQuery represents a SHOW PRIVILEGES statement. +type ShowPrivilegesQuery struct { + Position token.Position `json:"-"` +} + +func (s *ShowPrivilegesQuery) Pos() token.Position { return s.Position } +func (s *ShowPrivilegesQuery) End() token.Position { return s.Position } +func (s *ShowPrivilegesQuery) statementNode() {} + // ----------------------------------------------------------------------------- // Expressions diff --git a/internal/explain/explain.go b/internal/explain/explain.go index f43fab680..419abd4f0 100644 --- a/internal/explain/explain.go +++ b/internal/explain/explain.go @@ -115,6 +115,8 @@ func Node(sb *strings.Builder, node interface{}, depth int) { explainExplainQuery(sb, n, indent, depth) case *ast.ShowQuery: explainShowQuery(sb, n, indent) + case *ast.ShowPrivilegesQuery: + fmt.Fprintf(sb, "%sShowPrivilegesQuery\n", indent) case *ast.UseQuery: explainUseQuery(sb, n, indent) case *ast.DescribeQuery: diff --git a/parser/parser.go b/parser/parser.go index 431897f85..f5657a4f3 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -2612,13 +2612,21 @@ func (p *Parser) parseDescribe() *ast.DescribeQuery { return desc } -func (p *Parser) parseShow() *ast.ShowQuery { - show := &ast.ShowQuery{ - Position: p.current.Pos, - } +func (p *Parser) parseShow() ast.Statement { + pos := p.current.Pos p.nextToken() // skip SHOW + // Handle SHOW PRIVILEGES first - it has its own statement type + if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "PRIVILEGES" { + p.nextToken() + return &ast.ShowPrivilegesQuery{Position: pos} + } + + show := &ast.ShowQuery{ + Position: pos, + } + switch p.current.Token { case token.TABLES: show.ShowType = ast.ShowTables diff --git a/parser/testdata/01271_show_privileges/metadata.json b/parser/testdata/01271_show_privileges/metadata.json index ef120d978..9e26dfeeb 100644 --- a/parser/testdata/01271_show_privileges/metadata.json +++ b/parser/testdata/01271_show_privileges/metadata.json @@ -1 +1 @@ -{"todo": true} +{} \ No newline at end of file