@@ -12,26 +12,54 @@ import (
12
12
)
13
13
14
14
var (
15
- sanitizeQuotesRegexp = regexp .MustCompile ("('[^']*')" )
16
- renameColumnRegexp = regexp .MustCompile (`(?i)\bchange\s+(column\s+|)([\S]+)\s+([\S]+)\s+` )
17
- dropColumnRegexp = regexp .MustCompile (`(?i)\bdrop\s+(column\s+|)([\S]+)$` )
18
- renameTableRegexp = regexp .MustCompile (`(?i)\brename\s+(to|as)\s+` )
15
+ sanitizeQuotesRegexp = regexp .MustCompile ("('[^']*')" )
16
+ renameColumnRegexp = regexp .MustCompile (`(?i)\bchange\s+(column\s+|)([\S]+)\s+([\S]+)\s+` )
17
+ dropColumnRegexp = regexp .MustCompile (`(?i)\bdrop\s+(column\s+|)([\S]+)$` )
18
+ renameTableRegexp = regexp .MustCompile (`(?i)\brename\s+(to|as)\s+` )
19
+ alterTableExplicitSchemaTableRegexps = []* regexp.Regexp {
20
+ // ALTER TABLE `scm`.`tbl` something
21
+ regexp .MustCompile (`(?i)\balter\s+table\s+` + "`" + `([^` + "`" + `]+)` + "`" + `[.]` + "`" + `([^` + "`" + `]+)` + "`" + `\s+(.*$)` ),
22
+ // ALTER TABLE `scm`.tbl something
23
+ regexp .MustCompile (`(?i)\balter\s+table\s+` + "`" + `([^` + "`" + `]+)` + "`" + `[.]([\S]+)\s+(.*$)` ),
24
+ // ALTER TABLE scm.`tbl` something
25
+ regexp .MustCompile (`(?i)\balter\s+table\s+([\S]+)[.]` + "`" + `([^` + "`" + `]+)` + "`" + `\s+(.*$)` ),
26
+ // ALTER TABLE scm.tbl something
27
+ regexp .MustCompile (`(?i)\balter\s+table\s+([\S]+)[.]([\S]+)\s+(.*$)` ),
28
+ }
29
+ alterTableExplicitTableRegexps = []* regexp.Regexp {
30
+ // ALTER TABLE `tbl` something
31
+ regexp .MustCompile (`(?i)\balter\s+table\s+` + "`" + `([^` + "`" + `]+)` + "`" + `\s+(.*$)` ),
32
+ // ALTER TABLE tbl something
33
+ regexp .MustCompile (`(?i)\balter\s+table\s+([\S]+)\s+(.*$)` ),
34
+ }
19
35
)
20
36
21
- type Parser struct {
37
+ type AlterTableParser struct {
22
38
columnRenameMap map [string ]string
23
39
droppedColumns map [string ]bool
24
40
isRenameTable bool
41
+
42
+ alterStatementOptions string
43
+ alterTokens []string
44
+
45
+ explicitSchema string
46
+ explicitTable string
25
47
}
26
48
27
- func NewParser () * Parser {
28
- return & Parser {
49
+ func NewAlterTableParser () * AlterTableParser {
50
+ return & AlterTableParser {
29
51
columnRenameMap : make (map [string ]string ),
30
52
droppedColumns : make (map [string ]bool ),
31
53
}
32
54
}
33
55
34
- func (this * Parser ) tokenizeAlterStatement (alterStatement string ) (tokens []string , err error ) {
56
+ func NewParserFromAlterStatement (alterStatement string ) * AlterTableParser {
57
+ parser := NewAlterTableParser ()
58
+ parser .ParseAlterStatement (alterStatement )
59
+ return parser
60
+ }
61
+
62
+ func (this * AlterTableParser ) tokenizeAlterStatement (alterStatement string ) (tokens []string , err error ) {
35
63
terminatingQuote := rune (0 )
36
64
f := func (c rune ) bool {
37
65
switch {
@@ -58,13 +86,13 @@ func (this *Parser) tokenizeAlterStatement(alterStatement string) (tokens []stri
58
86
return tokens , nil
59
87
}
60
88
61
- func (this * Parser ) sanitizeQuotesFromAlterStatement (alterStatement string ) (strippedStatement string ) {
89
+ func (this * AlterTableParser ) sanitizeQuotesFromAlterStatement (alterStatement string ) (strippedStatement string ) {
62
90
strippedStatement = alterStatement
63
91
strippedStatement = sanitizeQuotesRegexp .ReplaceAllString (strippedStatement , "''" )
64
92
return strippedStatement
65
93
}
66
94
67
- func (this * Parser ) parseAlterToken (alterToken string ) (err error ) {
95
+ func (this * AlterTableParser ) parseAlterToken (alterToken string ) (err error ) {
68
96
{
69
97
// rename
70
98
allStringSubmatch := renameColumnRegexp .FindAllStringSubmatch (alterToken , - 1 )
@@ -97,16 +125,34 @@ func (this *Parser) parseAlterToken(alterToken string) (err error) {
97
125
return nil
98
126
}
99
127
100
- func (this * Parser ) ParseAlterStatement (alterStatement string ) (err error ) {
101
- alterTokens , _ := this .tokenizeAlterStatement (alterStatement )
128
+ func (this * AlterTableParser ) ParseAlterStatement (alterStatement string ) (err error ) {
129
+
130
+ this .alterStatementOptions = alterStatement
131
+ for _ , alterTableRegexp := range alterTableExplicitSchemaTableRegexps {
132
+ if submatch := alterTableRegexp .FindStringSubmatch (this .alterStatementOptions ); len (submatch ) > 0 {
133
+ this .explicitSchema = submatch [1 ]
134
+ this .explicitTable = submatch [2 ]
135
+ this .alterStatementOptions = submatch [3 ]
136
+ break
137
+ }
138
+ }
139
+ for _ , alterTableRegexp := range alterTableExplicitTableRegexps {
140
+ if submatch := alterTableRegexp .FindStringSubmatch (this .alterStatementOptions ); len (submatch ) > 0 {
141
+ this .explicitTable = submatch [1 ]
142
+ this .alterStatementOptions = submatch [2 ]
143
+ break
144
+ }
145
+ }
146
+ alterTokens , _ := this .tokenizeAlterStatement (this .alterStatementOptions )
102
147
for _ , alterToken := range alterTokens {
103
148
alterToken = this .sanitizeQuotesFromAlterStatement (alterToken )
104
149
this .parseAlterToken (alterToken )
150
+ this .alterTokens = append (this .alterTokens , alterToken )
105
151
}
106
152
return nil
107
153
}
108
154
109
- func (this * Parser ) GetNonTrivialRenames () map [string ]string {
155
+ func (this * AlterTableParser ) GetNonTrivialRenames () map [string ]string {
110
156
result := make (map [string ]string )
111
157
for column , renamed := range this .columnRenameMap {
112
158
if column != renamed {
@@ -116,14 +162,33 @@ func (this *Parser) GetNonTrivialRenames() map[string]string {
116
162
return result
117
163
}
118
164
119
- func (this * Parser ) HasNonTrivialRenames () bool {
165
+ func (this * AlterTableParser ) HasNonTrivialRenames () bool {
120
166
return len (this .GetNonTrivialRenames ()) > 0
121
167
}
122
168
123
- func (this * Parser ) DroppedColumnsMap () map [string ]bool {
169
+ func (this * AlterTableParser ) DroppedColumnsMap () map [string ]bool {
124
170
return this .droppedColumns
125
171
}
126
172
127
- func (this * Parser ) IsRenameTable () bool {
173
+ func (this * AlterTableParser ) IsRenameTable () bool {
128
174
return this .isRenameTable
129
175
}
176
+ func (this * AlterTableParser ) GetExplicitSchema () string {
177
+ return this .explicitSchema
178
+ }
179
+
180
+ func (this * AlterTableParser ) HasExplicitSchema () bool {
181
+ return this .GetExplicitSchema () != ""
182
+ }
183
+
184
+ func (this * AlterTableParser ) GetExplicitTable () string {
185
+ return this .explicitTable
186
+ }
187
+
188
+ func (this * AlterTableParser ) HasExplicitTable () bool {
189
+ return this .GetExplicitTable () != ""
190
+ }
191
+
192
+ func (this * AlterTableParser ) GetAlterStatementOptions () string {
193
+ return this .alterStatementOptions
194
+ }
0 commit comments