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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions ast/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,18 @@ func (o *OptimizeQuery) Pos() token.Position { return o.Position }
func (o *OptimizeQuery) End() token.Position { return o.Position }
func (o *OptimizeQuery) statementNode() {}

// CheckQuery represents a CHECK TABLE statement.
type CheckQuery struct {
Position token.Position `json:"-"`
Database string `json:"database,omitempty"`
Table string `json:"table"`
Settings []*SettingExpr `json:"settings,omitempty"`
}

func (c *CheckQuery) Pos() token.Position { return c.Position }
func (c *CheckQuery) End() token.Position { return c.Position }
func (c *CheckQuery) statementNode() {}

// SystemQuery represents a SYSTEM statement.
type SystemQuery struct {
Position token.Position `json:"-"`
Expand Down
2 changes: 2 additions & 0 deletions internal/explain/explain.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ func Node(sb *strings.Builder, node interface{}, depth int) {
explainOptimizeQuery(sb, n, indent)
case *ast.TruncateQuery:
explainTruncateQuery(sb, n, indent)
case *ast.CheckQuery:
explainCheckQuery(sb, n, indent)

// Types
case *ast.DataType:
Expand Down
63 changes: 52 additions & 11 deletions internal/explain/statements.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
}
// Count children: name + columns + engine/storage
children := 1 // name identifier
if len(n.Columns) > 0 {
if len(n.Columns) > 0 || len(n.Indexes) > 0 || len(n.Constraints) > 0 {
children++
}
if n.Engine != nil || len(n.OrderBy) > 0 || len(n.PrimaryKey) > 0 || n.PartitionBy != nil {
Expand All @@ -141,14 +141,17 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
fmt.Fprintf(sb, "%sCreateQuery %s (children %d)\n", indent, name, children)
}
fmt.Fprintf(sb, "%s Identifier %s\n", indent, name)
if len(n.Columns) > 0 || len(n.Indexes) > 0 {
if len(n.Columns) > 0 || len(n.Indexes) > 0 || len(n.Constraints) > 0 {
childrenCount := 0
if len(n.Columns) > 0 {
childrenCount++
}
if len(n.Indexes) > 0 {
childrenCount++
}
if len(n.Constraints) > 0 {
childrenCount++
}
// Check for PRIMARY KEY constraints in column declarations
var primaryKeyColumns []string
for _, col := range n.Columns {
Expand All @@ -172,6 +175,14 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
Index(sb, idx, depth+3)
}
}
// Output constraints wrapped in Constraint nodes
if len(n.Constraints) > 0 {
fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(n.Constraints))
for _, constraint := range n.Constraints {
fmt.Fprintf(sb, "%s Constraint (children 1)\n", indent)
Node(sb, constraint.Expression, depth+4)
}
}
// Output PRIMARY KEY columns as Function tuple
if len(primaryKeyColumns) > 0 {
fmt.Fprintf(sb, "%s Function tuple (children %d)\n", indent, 1)
Expand All @@ -181,7 +192,7 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
}
}
}
if n.Engine != nil || len(n.OrderBy) > 0 || len(n.PrimaryKey) > 0 || n.PartitionBy != nil || n.SampleBy != nil || len(n.Settings) > 0 {
if n.Engine != nil || len(n.OrderBy) > 0 || len(n.PrimaryKey) > 0 || n.PartitionBy != nil || n.SampleBy != nil || n.TTL != nil || len(n.Settings) > 0 {
storageChildren := 0
if n.Engine != nil {
storageChildren++
Expand Down Expand Up @@ -214,6 +225,9 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
}
}
}
if n.TTL != nil {
storageChildren++
}
if len(n.Settings) > 0 {
storageChildren++
}
Expand Down Expand Up @@ -313,6 +327,11 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string,
}
}
}
if n.TTL != nil {
fmt.Fprintf(sb, "%s ExpressionList (children 1)\n", indent)
fmt.Fprintf(sb, "%s TTLElement (children 1)\n", indent)
Node(sb, n.TTL.Expression, depth+4)
}
if len(n.Settings) > 0 {
fmt.Fprintf(sb, "%s Set\n", indent)
}
Expand Down Expand Up @@ -681,7 +700,8 @@ func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent stri
case ast.AlterDropPartition, ast.AlterDetachPartition, ast.AlterAttachPartition,
ast.AlterReplacePartition, ast.AlterFreezePartition:
if cmd.Partition != nil {
Node(sb, cmd.Partition, depth+1)
fmt.Fprintf(sb, "%s Partition (children 1)\n", indent)
Node(sb, cmd.Partition, depth+2)
}
case ast.AlterFreeze:
// No children
Expand All @@ -690,18 +710,16 @@ func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent stri
Node(sb, cmd.Where, depth+1)
}
case ast.AlterUpdate:
if cmd.Where != nil {
Node(sb, cmd.Where, depth+1)
}
if len(cmd.Assignments) > 0 {
fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(cmd.Assignments))
for _, assign := range cmd.Assignments {
fmt.Fprintf(sb, "%s Function equals (children 1)\n", indent)
fmt.Fprintf(sb, "%s ExpressionList (children 2)\n", indent)
fmt.Fprintf(sb, "%s Identifier %s\n", indent, assign.Column)
Node(sb, assign.Value, depth+4)
fmt.Fprintf(sb, "%s Assignment %s (children 1)\n", indent, assign.Column)
Node(sb, assign.Value, depth+3)
}
}
if cmd.Where != nil {
Node(sb, cmd.Where, depth+1)
}
case ast.AlterAddProjection:
if cmd.Projection != nil {
explainProjection(sb, cmd.Projection, indent, depth+1)
Expand Down Expand Up @@ -866,3 +884,26 @@ func explainTruncateQuery(sb *strings.Builder, n *ast.TruncateQuery, indent stri
fmt.Fprintf(sb, "%sTruncateQuery %s (children %d)\n", indent, name, 1)
fmt.Fprintf(sb, "%s Identifier %s\n", indent, name)
}

func explainCheckQuery(sb *strings.Builder, n *ast.CheckQuery, indent string) {
if n == nil {
fmt.Fprintf(sb, "%s*ast.CheckQuery\n", indent)
return
}

name := n.Table
if n.Database != "" {
name = n.Database + "." + n.Table
}

children := 1 // identifier
if len(n.Settings) > 0 {
children++
}

fmt.Fprintf(sb, "%sCheckQuery %s (children %d)\n", indent, name, children)
fmt.Fprintf(sb, "%s Identifier %s\n", indent, name)
if len(n.Settings) > 0 {
fmt.Fprintf(sb, "%s Set\n", indent)
}
}
33 changes: 33 additions & 0 deletions parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ func (p *Parser) parseStatement() ast.Statement {
return p.parseDetach()
case token.ATTACH:
return p.parseAttach()
case token.CHECK:
return p.parseCheck()
default:
p.errors = append(p.errors, fmt.Errorf("unexpected token %s at line %d, column %d",
p.current.Token, p.current.Pos.Line, p.current.Pos.Column))
Expand Down Expand Up @@ -3636,6 +3638,37 @@ func (p *Parser) parseAttach() *ast.AttachQuery {
return attach
}

func (p *Parser) parseCheck() *ast.CheckQuery {
check := &ast.CheckQuery{
Position: p.current.Pos,
}

p.nextToken() // skip CHECK

// Skip optional TABLE keyword
if p.currentIs(token.TABLE) {
p.nextToken()
}

// Parse table name (can be qualified: database.table)
tableName := p.parseIdentifierName()
if p.currentIs(token.DOT) {
p.nextToken()
check.Database = tableName
check.Table = p.parseIdentifierName()
} else {
check.Table = tableName
}

// Parse optional SETTINGS
if p.currentIs(token.SETTINGS) {
p.nextToken() // skip SETTINGS
check.Settings = p.parseSettingsList()
}

return check
}

func (p *Parser) parseArrayJoin() *ast.ArrayJoinClause {
aj := &ast.ArrayJoinClause{
Position: p.current.Pos,
Expand Down
7 changes: 6 additions & 1 deletion parser/testdata/00054_merge_tree_partitions/metadata.json
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
{"explain_todo":{"stmt12":true,"stmt16":true,"stmt20":true,"stmt8":true}}
{
"explain_todo": {
"stmt16": true,
"stmt8": true
}
}
5 changes: 0 additions & 5 deletions parser/testdata/00063_check_query/metadata.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
{
"explain_todo": {
"stmt13": true,
"stmt5": true,
"stmt6": true,
"stmt7": true,
"stmt8": true,
"stmt9": true
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"explain_todo": {
"stmt7": true,
"stmt8": true
"stmt7": true
}
}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"explain_todo":{"stmt9":true}}
{}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"stmt46": true,
"stmt47": true,
"stmt48": true,
"stmt49": true,
"stmt6": true,
"stmt8": true
}
Expand Down
3 changes: 0 additions & 3 deletions parser/testdata/00502_custom_partitioning_local/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"stmt25": true,
"stmt26": true,
"stmt28": true,
"stmt31": true,
"stmt41": true,
"stmt42": true,
"stmt43": true,
Expand All @@ -15,10 +14,8 @@
"stmt58": true,
"stmt59": true,
"stmt61": true,
"stmt64": true,
"stmt7": true,
"stmt73": true,
"stmt76": true,
"stmt8": true
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"explain_todo": {
"stmt101": true,
"stmt11": true,
"stmt12": true,
"stmt13": true,
Expand All @@ -12,7 +11,6 @@
"stmt34": true,
"stmt35": true,
"stmt37": true,
"stmt40": true,
"stmt53": true,
"stmt54": true,
"stmt55": true,
Expand All @@ -25,7 +23,6 @@
"stmt77": true,
"stmt78": true,
"stmt80": true,
"stmt83": true,
"stmt94": true,
"stmt95": true,
"stmt96": true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"explain_todo":{"stmt11":true}}
{}
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
{
"explain_todo": {
"stmt7": true
}
}
{}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"explain_todo": {
"stmt5": true,
"stmt9": true
"stmt5": true
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
{
"explain_todo": {
"stmt16": true,
"stmt17": true,
"stmt21": true,
"stmt22": true,
"stmt25": true,
"stmt28": true,
"stmt29": true,
"stmt31": true,
"stmt35": true,
"stmt42": true,
"stmt44": true,
"stmt46": true,
"stmt50": true,
"stmt59": true,
"stmt60": true,
"stmt61": true,
"stmt62": true
"stmt61": true
}
}
6 changes: 0 additions & 6 deletions parser/testdata/00753_alter_attach/metadata.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
{
"explain_todo": {
"stmt12": true,
"stmt14": true,
"stmt16": true,
"stmt22": true,
"stmt24": true,
"stmt34": true,
"stmt36": true,
"stmt38": true,
"stmt4": true,
"stmt40": true,
"stmt42": true,
Expand All @@ -17,13 +13,11 @@
"stmt54": true,
"stmt55": true,
"stmt56": true,
"stmt57": true,
"stmt58": true,
"stmt63": true,
"stmt65": true,
"stmt67": true,
"stmt69": true,
"stmt7": true,
"stmt71": true,
"stmt73": true,
"stmt77": true,
Expand Down
1 change: 0 additions & 1 deletion parser/testdata/00933_ttl_formatting/metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"explain_todo": {
"stmt1": true,
"stmt2": true,
"stmt3": true
}
Expand Down
6 changes: 1 addition & 5 deletions parser/testdata/00933_ttl_simple/metadata.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
{
"explain_todo": {
"stmt11": true,
"stmt19": true,
"stmt26": true,
"stmt33": true,
"stmt39": true,
"stmt4": true,
"stmt45": true,
Expand All @@ -13,7 +10,6 @@
"stmt65": true,
"stmt66": true,
"stmt67": true,
"stmt68": true,
"stmt69": true
"stmt68": true
}
}
1 change: 0 additions & 1 deletion parser/testdata/00952_part_frozen_info/metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"explain_todo": {
"stmt6": true,
"stmt9": true
}
}
Loading