Skip to content

Commit f142964

Browse files
committed
feat: wrap ALTER-nodes into transaction statements
1 parent caef5a3 commit f142964

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

engine/internal/schema/diff/diff.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ func detectNodeType(node *pg_query.Node) []*pg_query.Node {
5050
DropStmt(stmt)
5151

5252
case *pg_query.Node_AlterTableStmt:
53-
fmt.Println("Alter Type")
5453
return AlterStmt(node)
5554

5655
case *pg_query.Node_SelectStmt:
@@ -88,10 +87,6 @@ func AlterStmt(node *pg_query.Node) []*pg_query.Node {
8887
for _, cmd := range initialCommands {
8988
switch v := cmd.Node.(type) {
9089
case *pg_query.Node_AlterTableCmd:
91-
fmt.Printf("%#v\n", v)
92-
fmt.Printf("%#v\n", v.AlterTableCmd.Def.Node)
93-
fmt.Println(v.AlterTableCmd.Subtype.Enum())
94-
9590
switch v.AlterTableCmd.Subtype {
9691
case pg_query.AlterTableType_AT_AddColumn:
9792
def := v.AlterTableCmd.Def.GetColumnDef()
@@ -106,13 +101,13 @@ func AlterStmt(node *pg_query.Node) []*pg_query.Node {
106101
if index, ok := constraintsMap[pg_query.ConstrType_CONSTR_DEFAULT]; ok {
107102
def.Constraints = make([]*pg_query.Node, 0)
108103

109-
alterStmts = append(alterStmts, node)
104+
alterStmts = append(alterStmts, wrapTransaction([]*pg_query.Node{node})...)
110105

111106
defaultDefinitionTemp := fmt.Sprintf(`alter table %s alter column %s set default %v;`,
112107
alterTableStmt.GetRelation().GetRelname(), def.Colname,
113108
constraints[index].GetConstraint().GetRawExpr().GetAConst().GetVal().GetInteger().GetIval())
114109

115-
alterStmts = append(alterStmts, generateNodes(defaultDefinitionTemp)...)
110+
alterStmts = append(alterStmts, wrapTransaction(generateNodes(defaultDefinitionTemp))...)
116111

117112
// TODO: Update rows
118113

@@ -125,12 +120,12 @@ func AlterStmt(node *pg_query.Node) []*pg_query.Node {
125120
constraint := v.AlterTableCmd.Def.GetConstraint()
126121
constraint.SkipValidation = true
127122

128-
alterStmts = append(alterStmts, node)
123+
alterStmts = append(alterStmts, wrapTransaction([]*pg_query.Node{node})...)
129124

130-
validationTemp := fmt.Sprintf(`begin; alter table %s validate constraint %s; commit;`,
125+
validationTemp := fmt.Sprintf(`alter table %s validate constraint %s;`,
131126
alterTableStmt.GetRelation().GetRelname(), constraint.GetConname())
132127

133-
alterStmts = append(alterStmts, generateNodes(validationTemp)...)
128+
alterStmts = append(alterStmts, wrapTransaction(generateNodes(validationTemp))...)
134129

135130
default:
136131
alterStmts = append(alterStmts, node)
@@ -160,3 +155,14 @@ func generateNodes(nodeTemplate string) []*pg_query.Node {
160155

161156
return nodes
162157
}
158+
159+
// wrapTransaction wraps nodes into transaction statements.
160+
func wrapTransaction(nodes []*pg_query.Node) []*pg_query.Node {
161+
begin := makeBeginTransactionStmt()
162+
commit := makeCommitTransactionStmt()
163+
164+
nodes = append([]*pg_query.Node{begin}, nodes...)
165+
nodes = append(nodes, commit)
166+
167+
return nodes
168+
}

engine/internal/schema/diff/diff_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ const expectedTpl = `CREATE UNIQUE INDEX CONCURRENTLY title_idx ON films USING b
2626
2727
DROP INDEX CONCURRENTLY title_idx;
2828
29-
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NOT VALID;
29+
BEGIN; ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NOT VALID; COMMIT;
3030
BEGIN; ALTER TABLE distributors VALIDATE CONSTRAINT zipchk; COMMIT;
3131
32-
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID;
32+
BEGIN; ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID; COMMIT;
3333
BEGIN; ALTER TABLE distributors VALIDATE CONSTRAINT distfk; COMMIT;
3434
35-
ALTER TABLE pgbench_accounts ADD COLUMN test int;
36-
ALTER TABLE pgbench_accounts ALTER COLUMN test SET DEFAULT 0`
35+
BEGIN; ALTER TABLE pgbench_accounts ADD COLUMN test int; COMMIT;
36+
BEGIN; ALTER TABLE pgbench_accounts ALTER COLUMN test SET DEFAULT 0; COMMIT`
3737

3838
var space = regexp.MustCompile(`\s+`)
3939

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package diff
2+
3+
import (
4+
pg_query "github.com/pganalyze/pg_query_go/v2"
5+
)
6+
7+
func makeBeginTransactionStmt() *pg_query.Node {
8+
return &pg_query.Node{
9+
Node: &pg_query.Node_TransactionStmt{
10+
TransactionStmt: &pg_query.TransactionStmt{
11+
Kind: pg_query.TransactionStmtKind_TRANS_STMT_BEGIN,
12+
},
13+
},
14+
}
15+
}
16+
17+
func makeCommitTransactionStmt() *pg_query.Node {
18+
return &pg_query.Node{
19+
Node: &pg_query.Node_TransactionStmt{
20+
TransactionStmt: &pg_query.TransactionStmt{
21+
Kind: pg_query.TransactionStmtKind_TRANS_STMT_COMMIT,
22+
},
23+
},
24+
}
25+
}

0 commit comments

Comments
 (0)