diff --git a/parser/ast.go b/parser/ast.go index 76a794c..98ad02b 100644 --- a/parser/ast.go +++ b/parser/ast.go @@ -5577,6 +5577,7 @@ type DropDatabase struct { Name *Ident IfExists bool OnCluster *ClusterClause + Modifier string } func (d *DropDatabase) Pos() Pos { diff --git a/parser/format.go b/parser/format.go index e704c4a..60ea32a 100644 --- a/parser/format.go +++ b/parser/format.go @@ -1403,6 +1403,9 @@ func (d *DropDatabase) FormatSQL(formatter *Formatter) { formatter.WriteByte(whitespace) formatter.WriteExpr(d.OnCluster) } + if len(d.Modifier) != 0 { + formatter.WriteString(" " + d.Modifier) + } } func (d *DropStmt) FormatSQL(formatter *Formatter) { diff --git a/parser/parser_drop.go b/parser/parser_drop.go index 8e16026..dc06329 100644 --- a/parser/parser_drop.go +++ b/parser/parser_drop.go @@ -25,11 +25,20 @@ func (p *Parser) parseDropDatabase(pos Pos) (*DropDatabase, error) { statementEnd = onCluster.End() } + modifier, err := p.tryParseModifier() + if err != nil { + return nil, err + } + if modifier != "" { + statementEnd = p.Pos() + } + return &DropDatabase{ DropPos: pos, Name: name, IfExists: isExists, OnCluster: onCluster, + Modifier: modifier, StatementEnd: statementEnd, }, nil } diff --git a/parser/testdata/ddl/drop_database.sql b/parser/testdata/ddl/drop_database.sql index 3cf7d18..156906f 100644 --- a/parser/testdata/ddl/drop_database.sql +++ b/parser/testdata/ddl/drop_database.sql @@ -1 +1,4 @@ DROP DATABASE IF EXISTS datbase_name; +DROP DATABASE IF EXISTS test_db SYNC; +DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC; +DROP DATABASE test_db ON CLUSTER akvorado NO DELAY; diff --git a/parser/testdata/ddl/format/beautify/drop_database.sql b/parser/testdata/ddl/format/beautify/drop_database.sql index 08cbfe5..9ac4761 100644 --- a/parser/testdata/ddl/format/beautify/drop_database.sql +++ b/parser/testdata/ddl/format/beautify/drop_database.sql @@ -1,6 +1,12 @@ -- Origin SQL: DROP DATABASE IF EXISTS datbase_name; +DROP DATABASE IF EXISTS test_db SYNC; +DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC; +DROP DATABASE test_db ON CLUSTER akvorado NO DELAY; -- Beautify SQL: DROP DATABASE IF EXISTS datbase_name; +DROP DATABASE IF EXISTS test_db SYNC; +DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC; +DROP DATABASE test_db ON CLUSTER akvorado NO DELAY; diff --git a/parser/testdata/ddl/format/drop_database.sql b/parser/testdata/ddl/format/drop_database.sql index 99ba443..caf4835 100644 --- a/parser/testdata/ddl/format/drop_database.sql +++ b/parser/testdata/ddl/format/drop_database.sql @@ -1,6 +1,12 @@ -- Origin SQL: DROP DATABASE IF EXISTS datbase_name; +DROP DATABASE IF EXISTS test_db SYNC; +DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC; +DROP DATABASE test_db ON CLUSTER akvorado NO DELAY; -- Format SQL: DROP DATABASE IF EXISTS datbase_name; +DROP DATABASE IF EXISTS test_db SYNC; +DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC; +DROP DATABASE test_db ON CLUSTER akvorado NO DELAY; diff --git a/parser/testdata/ddl/output/drop_database.sql.golden.json b/parser/testdata/ddl/output/drop_database.sql.golden.json index 13bb20d..dae0a05 100644 --- a/parser/testdata/ddl/output/drop_database.sql.golden.json +++ b/parser/testdata/ddl/output/drop_database.sql.golden.json @@ -9,6 +9,62 @@ "NameEnd": 36 }, "IfExists": true, - "OnCluster": null + "OnCluster": null, + "Modifier": "" + }, + { + "DropPos": 38, + "StatementEnd": 74, + "Name": { + "Name": "test_db", + "QuoteType": 1, + "NamePos": 62, + "NameEnd": 69 + }, + "IfExists": true, + "OnCluster": null, + "Modifier": "SYNC" + }, + { + "DropPos": 76, + "StatementEnd": 132, + "Name": { + "Name": "test_db", + "QuoteType": 1, + "NamePos": 100, + "NameEnd": 107 + }, + "IfExists": true, + "OnCluster": { + "OnPos": 108, + "Expr": { + "Name": "akvorado", + "QuoteType": 1, + "NamePos": 119, + "NameEnd": 127 + } + }, + "Modifier": "SYNC" + }, + { + "DropPos": 134, + "StatementEnd": 184, + "Name": { + "Name": "test_db", + "QuoteType": 1, + "NamePos": 148, + "NameEnd": 155 + }, + "IfExists": false, + "OnCluster": { + "OnPos": 156, + "Expr": { + "Name": "akvorado", + "QuoteType": 1, + "NamePos": 167, + "NameEnd": 175 + } + }, + "Modifier": "NO DELAY" } ] \ No newline at end of file