Skip to content

Commit 34ca664

Browse files
authored
Add DESCRIBE subquery support for DESCRIBE (SELECT ...) statements (#98)
1 parent e63703e commit 34ca664

File tree

15 files changed

+35
-185
lines changed

15 files changed

+35
-185
lines changed

ast/ast.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -623,12 +623,13 @@ func (a *AttachQuery) statementNode() {}
623623

624624
// DescribeQuery represents a DESCRIBE statement.
625625
type DescribeQuery struct {
626-
Position token.Position `json:"-"`
627-
Database string `json:"database,omitempty"`
628-
Table string `json:"table,omitempty"`
629-
TableFunction *FunctionCall `json:"table_function,omitempty"`
630-
Settings []*SettingExpr `json:"settings,omitempty"`
631-
Format string `json:"format,omitempty"`
626+
Position token.Position `json:"-"`
627+
Database string `json:"database,omitempty"`
628+
Table string `json:"table,omitempty"`
629+
TableFunction *FunctionCall `json:"table_function,omitempty"`
630+
TableExpr *TableExpression `json:"table_expr,omitempty"` // For DESCRIBE (SELECT ...)
631+
Settings []*SettingExpr `json:"settings,omitempty"`
632+
Format string `json:"format,omitempty"`
632633
}
633634

634635
func (d *DescribeQuery) Pos() token.Position { return d.Position }

internal/explain/explain.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func Node(sb *strings.Builder, node interface{}, depth int) {
134134
case *ast.UseQuery:
135135
explainUseQuery(sb, n, indent)
136136
case *ast.DescribeQuery:
137-
explainDescribeQuery(sb, n, indent)
137+
explainDescribeQuery(sb, n, indent, depth)
138138
case *ast.ExistsQuery:
139139
explainExistsTableQuery(sb, n, indent)
140140
case *ast.DetachQuery:

internal/explain/statements.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,19 @@ func explainUseQuery(sb *strings.Builder, n *ast.UseQuery, indent string) {
577577
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Database)
578578
}
579579

580-
func explainDescribeQuery(sb *strings.Builder, n *ast.DescribeQuery, indent string) {
581-
if n.TableFunction != nil {
580+
func explainDescribeQuery(sb *strings.Builder, n *ast.DescribeQuery, indent string, depth int) {
581+
if n.TableExpr != nil {
582+
// DESCRIBE on a subquery - TableExpr contains a TableExpression with a Subquery
583+
children := 1
584+
if len(n.Settings) > 0 {
585+
children++
586+
}
587+
fmt.Fprintf(sb, "%sDescribeQuery (children %d)\n", indent, children)
588+
Node(sb, n.TableExpr, depth+1)
589+
if len(n.Settings) > 0 {
590+
fmt.Fprintf(sb, "%s Set\n", indent)
591+
}
592+
} else if n.TableFunction != nil {
582593
// DESCRIBE on a table function - wrap in TableExpression
583594
children := 1
584595
if len(n.Settings) > 0 {

parser/parser.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3253,9 +3253,12 @@ func (p *Parser) parseDescribe() *ast.DescribeQuery {
32533253
p.nextToken()
32543254
}
32553255

3256-
// Parse table name or table function
3257-
// Table functions look like: format(CSV, '...'), url('...'), s3Cluster(...)
3258-
if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() {
3256+
// Check for subquery: DESCRIBE (SELECT ...)
3257+
if p.currentIs(token.LPAREN) {
3258+
desc.TableExpr = p.parseTableExpression()
3259+
} else if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() {
3260+
// Parse table name or table function
3261+
// Table functions look like: format(CSV, '...'), url('...'), s3Cluster(...)
32593262
pos := p.current.Pos
32603263
tableName := p.current.Value
32613264
p.nextToken()
Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1 @@
1-
{
2-
"explain_todo": {
3-
"stmt12": true,
4-
"stmt14": true,
5-
"stmt16": true
6-
}
7-
}
1+
{}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
{
22
"explain_todo": {
3-
"stmt4": true,
4-
"stmt7": true
3+
"stmt4": true
54
}
65
}
Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1 @@
1-
{
2-
"explain_todo": {
3-
"stmt3": true,
4-
"stmt4": true,
5-
"stmt5": true
6-
}
7-
}
1+
{}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
{
2-
"explain_todo": {
3-
"stmt2": true
4-
}
5-
}
1+
{}
Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,6 @@
11
{
22
"explain_todo": {
3-
"stmt17": true,
4-
"stmt20": true,
5-
"stmt23": true,
6-
"stmt26": true,
7-
"stmt29": true,
8-
"stmt3": true,
9-
"stmt32": true,
10-
"stmt35": true,
113
"stmt42": true,
12-
"stmt43": true,
13-
"stmt45": true,
14-
"stmt48": true,
15-
"stmt51": true,
16-
"stmt6": true,
17-
"stmt9": true
4+
"stmt43": true
185
}
196
}
Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1 @@
1-
{
2-
"explain_todo": {
3-
"stmt11": true,
4-
"stmt14": true,
5-
"stmt17": true,
6-
"stmt2": true,
7-
"stmt20": true,
8-
"stmt23": true,
9-
"stmt25": true,
10-
"stmt5": true,
11-
"stmt8": true
12-
}
13-
}
1+
{}

0 commit comments

Comments
 (0)