Skip to content

Commit 85c4985

Browse files
author
Shlomi Noach
committed
parser recognizes DROP COLUMN tokens
1 parent acd78b3 commit 85c4985

2 files changed

Lines changed: 64 additions & 5 deletions

File tree

go/sql/parser.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,18 @@ import (
1414
var (
1515
sanitizeQuotesRegexp = regexp.MustCompile("('[^']*')")
1616
renameColumnRegexp = regexp.MustCompile(`(?i)\bchange\s+(column\s+|)([\S]+)\s+([\S]+)\s+`)
17+
dropColumnRegexp = regexp.MustCompile(`(?i)\bdrop\s+(column\s+|)([\S]+)$`)
1718
)
1819

1920
type Parser struct {
2021
columnRenameMap map[string]string
22+
droppedColumns map[string]bool
2123
}
2224

2325
func NewParser() *Parser {
2426
return &Parser{
2527
columnRenameMap: make(map[string]string),
28+
droppedColumns: make(map[string]bool),
2629
}
2730
}
2831

@@ -59,10 +62,9 @@ func (this *Parser) sanitizeQuotesFromAlterStatement(alterStatement string) (str
5962
return strippedStatement
6063
}
6164

62-
func (this *Parser) ParseAlterStatement(alterStatement string) (err error) {
63-
alterTokens, _ := this.tokenizeAlterStatement(alterStatement)
64-
for _, alterToken := range alterTokens {
65-
alterToken = this.sanitizeQuotesFromAlterStatement(alterToken)
65+
func (this *Parser) parseAlterToken(alterToken string) (err error) {
66+
{
67+
// rename
6668
allStringSubmatch := renameColumnRegexp.FindAllStringSubmatch(alterToken, -1)
6769
for _, submatch := range allStringSubmatch {
6870
if unquoted, err := strconv.Unquote(submatch[2]); err == nil {
@@ -71,10 +73,28 @@ func (this *Parser) ParseAlterStatement(alterStatement string) (err error) {
7173
if unquoted, err := strconv.Unquote(submatch[3]); err == nil {
7274
submatch[3] = unquoted
7375
}
74-
7576
this.columnRenameMap[submatch[2]] = submatch[3]
7677
}
7778
}
79+
{
80+
// drop
81+
allStringSubmatch := dropColumnRegexp.FindAllStringSubmatch(alterToken, -1)
82+
for _, submatch := range allStringSubmatch {
83+
if unquoted, err := strconv.Unquote(submatch[2]); err == nil {
84+
submatch[2] = unquoted
85+
}
86+
this.droppedColumns[submatch[2]] = true
87+
}
88+
}
89+
return nil
90+
}
91+
92+
func (this *Parser) ParseAlterStatement(alterStatement string) (err error) {
93+
alterTokens, _ := this.tokenizeAlterStatement(alterStatement)
94+
for _, alterToken := range alterTokens {
95+
alterToken = this.sanitizeQuotesFromAlterStatement(alterToken)
96+
this.parseAlterToken(alterToken)
97+
}
7898
return nil
7999
}
80100

go/sql/parser_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,42 @@ func TestSanitizeQuotesFromAlterStatement(t *testing.T) {
120120
test.S(t).ExpectEquals(strippedStatement, "change column i int ''")
121121
}
122122
}
123+
124+
func TestParseAlterStatementDroppedColumns(t *testing.T) {
125+
126+
{
127+
parser := NewParser()
128+
statement := "drop column b"
129+
err := parser.ParseAlterStatement(statement)
130+
test.S(t).ExpectNil(err)
131+
test.S(t).ExpectEquals(len(parser.droppedColumns), 1)
132+
test.S(t).ExpectTrue(parser.droppedColumns["b"])
133+
}
134+
{
135+
parser := NewParser()
136+
statement := "drop column b, drop key c_idx, drop column `d`"
137+
err := parser.ParseAlterStatement(statement)
138+
test.S(t).ExpectNil(err)
139+
test.S(t).ExpectEquals(len(parser.droppedColumns), 2)
140+
test.S(t).ExpectTrue(parser.droppedColumns["b"])
141+
test.S(t).ExpectTrue(parser.droppedColumns["d"])
142+
}
143+
{
144+
parser := NewParser()
145+
statement := "drop column b, drop key c_idx, drop column `d`, drop `e`, drop primary key, drop foreign key fk_1"
146+
err := parser.ParseAlterStatement(statement)
147+
test.S(t).ExpectNil(err)
148+
test.S(t).ExpectEquals(len(parser.droppedColumns), 3)
149+
test.S(t).ExpectTrue(parser.droppedColumns["b"])
150+
test.S(t).ExpectTrue(parser.droppedColumns["d"])
151+
test.S(t).ExpectTrue(parser.droppedColumns["e"])
152+
}
153+
{
154+
parser := NewParser()
155+
statement := "drop column b, drop bad statement, add column i int"
156+
err := parser.ParseAlterStatement(statement)
157+
test.S(t).ExpectNil(err)
158+
test.S(t).ExpectEquals(len(parser.droppedColumns), 1)
159+
test.S(t).ExpectTrue(parser.droppedColumns["b"])
160+
}
161+
}

0 commit comments

Comments
 (0)