forked from cockroachdb/cockroach
/
alter_table.go
124 lines (108 loc) · 3.18 KB
/
alter_table.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Copyright 2015 The Cockroach Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License. See the AUTHORS file
// for names of contributors.
//
// Author: Tamir Duberstein (tamird@gmail.com)
package parser
import (
"bytes"
"fmt"
)
// AlterTable represents an ALTER TABLE statement.
type AlterTable struct {
IfExists bool
Table *QualifiedName
Cmds AlterTableCmds
}
func (node *AlterTable) String() string {
var buf bytes.Buffer
buf.WriteString("ALTER TABLE")
if node.IfExists {
buf.WriteString(" IF EXISTS")
}
fmt.Fprintf(&buf, " %s %s", node.Table, node.Cmds)
return buf.String()
}
// AlterTableCmds represents a list of table alterations.
type AlterTableCmds []AlterTableCmd
func (node AlterTableCmds) String() string {
var prefix string
var buf bytes.Buffer
for _, n := range node {
fmt.Fprintf(&buf, "%s%s", prefix, n)
prefix = ", "
}
return buf.String()
}
// AlterTableCmd represents a table modification operation.
type AlterTableCmd interface {
// Placeholder function to ensure that only desired types
// (AlterTable*Cmd) conform to the AlterTableCmd interface.
alterTableCmd()
}
func (*AlterTableAddColumn) alterTableCmd() {}
func (*AlterTableAddConstraint) alterTableCmd() {}
func (*AlterTableDropColumn) alterTableCmd() {}
func (*AlterTableDropConstraint) alterTableCmd() {}
// AlterTableAddColumn represents an ADD COLUMN command.
type AlterTableAddColumn struct {
columnKeyword bool
IfNotExists bool
ColumnDef *ColumnTableDef
}
func (node *AlterTableAddColumn) String() string {
var buf bytes.Buffer
buf.WriteString("ADD")
if node.columnKeyword {
buf.WriteString(" COLUMN")
}
if node.IfNotExists {
buf.WriteString(" IF NOT EXISTS")
}
fmt.Fprintf(&buf, " %s", node.ColumnDef)
return buf.String()
}
// AlterTableAddConstraint represents an ADD CONSTRAINT command.
type AlterTableAddConstraint struct {
ConstraintDef ConstraintTableDef
}
func (node *AlterTableAddConstraint) String() string {
return fmt.Sprintf("ADD %s", node.ConstraintDef)
}
// AlterTableDropColumn represents a DROP COLUMN command.
type AlterTableDropColumn struct {
columnKeyword bool
IfExists bool
Column string
}
func (node *AlterTableDropColumn) String() string {
var buf bytes.Buffer
_, _ = buf.WriteString("DROP")
if node.columnKeyword {
_, _ = buf.WriteString(" COLUMN")
}
if node.IfExists {
_, _ = buf.WriteString(" IF EXISTS")
}
fmt.Fprintf(&buf, " %s", node.Column)
return buf.String()
}
// AlterTableDropConstraint represents a DROP CONSTRAINT command.
type AlterTableDropConstraint struct {
IfExists bool
Constraint string
}
func (node *AlterTableDropConstraint) String() string {
return fmt.Sprintf("DROP CONSTRAINT %s", node.Constraint)
}