Skip to content

Commit f9596b1

Browse files
committed
added truncate
1 parent 5b3b5b7 commit f9596b1

4 files changed

Lines changed: 62 additions & 16 deletions

File tree

kind.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@ import (
66
)
77

88
const (
9-
KindUnknown = "unknown"
10-
KindSelect = "select"
11-
KindLoad = "load"
12-
KindInsert = "insert"
13-
KindUpdate = "update"
14-
KindMerge = "merge"
15-
KindDelete = "delete"
16-
KindRegisterType = "register type"
17-
KindRegisterSet = "register set"
18-
KindCreateTable = "create table"
19-
KindDropTable = "drop table"
20-
KindCreateIndex = "create index"
21-
KindDropIndex = "drop index"
9+
KindUnknown = "unknown"
10+
KindSelect = "select"
11+
KindLoad = "load"
12+
KindInsert = "insert"
13+
KindUpdate = "update"
14+
KindMerge = "merge"
15+
KindDelete = "delete"
16+
KindRegisterType = "register type"
17+
KindRegisterSet = "register set"
18+
KindCreateTable = "create table"
19+
KindDropTable = "drop table"
20+
KindCreateIndex = "create index"
21+
KindDropIndex = "drop index"
22+
KindTruncateTable = "truncate table"
2223
)
2324

2425
// Kind represents the type of SQL statement.
@@ -139,6 +140,15 @@ func ParseKind(SQL string) Kind {
139140
return KindDropIndex
140141
}
141142
}
143+
case 't':
144+
if len(secondToken) == 0 {
145+
return KindUnknown
146+
}
147+
switch secondToken[0] {
148+
case 't': //truncate
149+
return KindTruncateTable
150+
}
151+
142152
case 'r': //register
143153
if len(secondToken) == 0 {
144154
return KindUnknown

lex.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const (
7474
registerKeyword
7575
typeKeyword
7676
ttlKeyword
77+
truncateTableKeyword
7778
)
7879

7980
var whitespaceMatcher = parsly.NewToken(whitespaceCode, "whitespace", matcher.NewWhiteSpace())
@@ -96,6 +97,7 @@ var inlineCommentMatcher = parsly.NewToken(commentBlock, "--", matcher.NewSeqBlo
9697
var selectKeywordMatcher = parsly.NewToken(selectKeyword, "SELECT", matcher.NewKeyword("select", &option.Case{}))
9798
var exceptKeywordMatcher = parsly.NewToken(exceptKeyword, "EXCEPT", matcher.NewKeyword("except", &option.Case{}))
9899
var betweenKeywordMatcher = parsly.NewToken(betweenToken, "BETWEEN", matcher.NewKeyword("between", &option.Case{}))
100+
var truncateKeywordMatcher = parsly.NewToken(truncateTableKeyword, "TRUNCATE", matcher.NewSpacedFragment("truncate table", &option.Case{}))
99101

100102
var fromKeywordMatcher = parsly.NewToken(fromKeyword, "FROM", matcher.NewKeyword("from", &option.Case{}))
101103
var joinMatcher = parsly.NewToken(joinToken, "LEFT OUTER JOIN|LEFT JOIN|JOIN", matcher.NewSpacedSet([]string{

table.go

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/viant/sqlparser/update"
1414
)
1515

16-
//TableName returns main table name
16+
// TableName returns main table name
1717
func TableName(node node.Node) string {
1818
switch actual := node.(type) {
1919
case *query.Select:
@@ -73,7 +73,35 @@ func trimEnclosure(node node.Node) string {
7373
return name
7474
}
7575

76-
//ParseDropTable parses drop table
76+
// ParseTruncateTable parses truncate table
77+
func ParseTruncateTable(SQL string) (*table.Truncate, error) {
78+
result := &table.Truncate{}
79+
SQL = removeSQLComments(SQL)
80+
cursor := parsly.NewCursor("", []byte(SQL), 0)
81+
err := parseTruncateTable(cursor, result)
82+
if err != nil {
83+
return result, fmt.Errorf("%s", SQL)
84+
}
85+
return result, err
86+
}
87+
88+
func parseTruncateTable(cursor *parsly.Cursor, result *table.Truncate) error {
89+
match := cursor.MatchAfterOptional(whitespaceMatcher, truncateKeywordMatcher)
90+
if match.Code != truncateTableKeyword {
91+
return cursor.NewError(truncateKeywordMatcher)
92+
}
93+
if match = cursor.MatchOne(whitespaceMatcher); match.Code != whitespaceCode {
94+
return cursor.NewError(whitespaceMatcher)
95+
}
96+
match = cursor.MatchAfterOptional(whitespaceMatcher, identifierMatcher)
97+
if match.Code != identifierCode {
98+
return cursor.NewError(identifierMatcher)
99+
}
100+
result.Table = match.Text(cursor)
101+
return nil
102+
}
103+
104+
// ParseDropTable parses drop table
77105
func ParseDropTable(SQL string) (*table.Drop, error) {
78106
result := &table.Drop{}
79107
SQL = removeSQLComments(SQL)
@@ -104,7 +132,7 @@ func parseDropTable(cursor *parsly.Cursor, dest *table.Drop) error {
104132
return nil
105133
}
106134

107-
//ParseCreateTable parses create table
135+
// ParseCreateTable parses create table
108136
func ParseCreateTable(SQL string) (*table.Create, error) {
109137
result := &table.Create{}
110138
SQL = removeSQLComments(SQL)

table/truncate.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package table
2+
3+
// Truncate represents a truncate table statement
4+
type Truncate struct {
5+
Table string
6+
}

0 commit comments

Comments
 (0)