From e9a3a6d759e1a0a644fab789671f17498c012194 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Wed, 5 Aug 2026 15:32:47 +0200 Subject: [PATCH] Add support for DROP DATABASE ... SYNC DROP DATABASE accepts the same SYNC and NO DELAY modifiers as DROP TABLE, but only parseDropStmt handled them, so these were rejected: DROP DATABASE IF EXISTS test_db SYNC DROP DATABASE IF EXISTS test_db ON CLUSTER akvorado SYNC Reuse tryParseModifier, which DROP TABLE and DROP USER already share. --- parser/ast.go | 1 + parser/format.go | 3 + parser/parser_drop.go | 9 +++ parser/testdata/ddl/drop_database.sql | 3 + .../ddl/format/beautify/drop_database.sql | 6 ++ parser/testdata/ddl/format/drop_database.sql | 6 ++ .../ddl/output/drop_database.sql.golden.json | 58 ++++++++++++++++++- 7 files changed, 85 insertions(+), 1 deletion(-) diff --git a/parser/ast.go b/parser/ast.go index 76a794c1..98ad02b6 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 e704c4a6..60ea32a7 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 8e160269..dc063290 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 3cf7d18e..156906fe 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 08cbfe53..9ac47616 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 99ba443d..caf48357 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 13bb20de..dae0a05a 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