Skip to content

Commit e9acebb

Browse files
committed
modified type registration, added set registration
1 parent 53ab3a1 commit e9acebb

4 files changed

Lines changed: 86 additions & 19 deletions

File tree

kind.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,30 @@ func (k Kind) IsDropTable() bool {
8080
func ParseKind(SQL string) Kind {
8181
SQL = removeSQLComments(SQL)
8282
normalizedSQL := strings.TrimSpace(SQL)
83+
if len(normalizedSQL) < 2 {
84+
return KindUnknown
85+
}
8386
firstToken := strings.ToLower(normalizedSQL[0:2])
8487
secondToken := ""
88+
secondPart := ""
89+
8590
if index := strings.Index(normalizedSQL, " "); index != -1 {
8691
for i := index; i < len(normalizedSQL); i++ {
8792
if unicode.IsLetter(rune(normalizedSQL[i])) {
8893
secondToken = strings.ToLower(normalizedSQL[i : i+1])
94+
if i+1 < len(normalizedSQL) {
95+
secondPart = normalizedSQL[i+1:]
96+
}
97+
break
98+
}
99+
}
100+
}
101+
102+
thirdToken := ""
103+
if index := strings.Index(secondPart, " "); index != -1 {
104+
for i := index; i < len(secondPart); i++ {
105+
if unicode.IsLetter(rune(secondPart[i])) {
106+
thirdToken = strings.ToLower(secondPart[i : i+1])
89107
break
90108
}
91109
}
@@ -108,19 +126,38 @@ func ParseKind(SQL string) Kind {
108126
case 'e': //delete
109127
return KindDelete
110128
case 'r': //drop
129+
if len(secondToken) == 0 {
130+
return KindUnknown
131+
}
111132
switch secondToken[0] {
112133
case 't': //drop table
113134
return KindDropTable
114135
}
115136
}
116137
case 'r': //register
138+
if len(secondToken) == 0 {
139+
return KindUnknown
140+
}
117141
switch secondToken[0] {
118-
case 't', 'g': //register type, global type
142+
case 't': //register type
119143
return KindRegisterType
120144
case 's': //register set
121145
return KindRegisterSet
146+
case 'g': //g global
147+
if len(thirdToken) == 0 {
148+
return KindUnknown
149+
}
150+
switch thirdToken[0] {
151+
case 't': //register type (global type)
152+
return KindRegisterType
153+
case 's': //register set (global set)
154+
return KindRegisterSet
155+
}
122156
}
123157
case 'c': //create
158+
if len(secondToken) == 0 {
159+
return KindUnknown
160+
}
124161
switch secondToken[0] {
125162
case 't': //create table
126163
return KindCreateTable

lex.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ const (
6666
deleteCode
6767
withKeyword
6868
unionKeyword
69-
registerTypeKeyword
7069
globalKeyword
71-
registerSetKeyword
70+
registerKeyword
71+
typeKeyword
72+
ttlKeyword
7273
)
7374

7475
var whitespaceMatcher = parsly.NewToken(whitespaceCode, "whitespace", matcher.NewWhiteSpace())
@@ -168,13 +169,13 @@ var ifExistsMatcher = parsly.NewToken(ifExistsToken, "IF EXISTS", matcher.NewSpa
168169
var createTableMatcher = parsly.NewToken(createTableToken, "CREATE TABLE", matcher.NewSpacedSet([]string{
169170
"create table"}, &option.Case{}))
170171

171-
var registerType = parsly.NewToken(registerTypeKeyword, "REGISTER TYPE", matcher.NewSpacedSet([]string{
172-
"register type"}, &option.Case{}))
173-
174-
var registerSet = parsly.NewToken(registerSetKeyword, "REGISTER SET", matcher.NewSpacedSet([]string{
175-
"register set"}, &option.Case{}))
176-
177172
var defaultMatcher = parsly.NewToken(defaultToken, "DEFAULT", matcher.NewKeyword("default", &option.Case{}))
178173

179174
var dropTableMatcher = parsly.NewToken(dropTableToken, "DROP TABLE", matcher.NewSpacedSet([]string{
180175
"drop table"}, &option.Case{}))
176+
177+
var registerKeywordMatcher = parsly.NewToken(registerKeyword, "REGISTER", matcher.NewKeyword("register", &option.Case{}))
178+
179+
var typeKeywordMatcher = parsly.NewToken(typeKeyword, "TYPE", matcher.NewKeyword("type", &option.Case{}))
180+
181+
var ttlKeywordMatcher = parsly.NewToken(ttlKeyword, "With TTL", matcher.NewFragment("with ttl", &option.Case{Sensitive: false}))

schema.go

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sqlparser
22

33
import (
4+
"fmt"
45
"github.com/viant/parsly"
56
"github.com/viant/sqlparser/schema"
67
"strings"
@@ -16,13 +17,18 @@ func ParseRegisterType(SQL string) (*schema.Register, error) {
1617
}
1718

1819
func parseRegisterType(cursor *parsly.Cursor, destination *schema.Register) error {
19-
match := cursor.MatchAfterOptional(whitespaceMatcher, registerType)
20-
if match.Code != registerTypeKeyword {
21-
return cursor.NewError(registerType)
20+
match := cursor.MatchAfterOptional(whitespaceMatcher, registerKeywordMatcher)
21+
if match.Code != registerKeyword {
22+
return cursor.NewError(registerKeywordMatcher)
2223
}
2324
if match = cursor.MatchAfterOptional(whitespaceMatcher, globalMatcher); match.Code == globalKeyword {
2425
destination.Global = true
2526
}
27+
28+
match = cursor.MatchAfterOptional(whitespaceMatcher, typeKeywordMatcher)
29+
if match.Code != typeKeyword {
30+
return cursor.NewError(typeKeywordMatcher)
31+
}
2632
match = cursor.MatchAfterOptional(whitespaceMatcher, selectorMatcher)
2733
if match.Code != selectorTokenCode {
2834
return cursor.NewError(selectorMatcher)
@@ -37,23 +43,41 @@ func parseRegisterType(cursor *parsly.Cursor, destination *schema.Register) erro
3743
}
3844

3945
// ParseRegisterSet parses register set
40-
func ParseRegisterSet(SQL string) (*schema.Register, error) {
41-
result := &schema.Register{}
46+
func ParseRegisterSet(SQL string) (*schema.RegisterSet, error) {
47+
result := &schema.RegisterSet{}
4248
SQL = removeSQLComments(SQL)
4349
cursor := parsly.NewCursor("", []byte(SQL), 0)
4450
err := parseRegisterSet(cursor, result)
4551
return result, err
4652
}
4753

48-
// TODO create parse register object
49-
func parseRegisterSet(cursor *parsly.Cursor, destination *schema.Register) error {
50-
match := cursor.MatchAfterOptional(whitespaceMatcher, registerSet)
51-
if match.Code != registerSetKeyword {
52-
return cursor.NewError(registerSet)
54+
func parseRegisterSet(cursor *parsly.Cursor, destination *schema.RegisterSet) error {
55+
match := cursor.MatchAfterOptional(whitespaceMatcher, registerKeywordMatcher)
56+
if match.Code != registerKeyword {
57+
return cursor.NewError(registerKeywordMatcher)
5358
}
5459
if match = cursor.MatchAfterOptional(whitespaceMatcher, globalMatcher); match.Code == globalKeyword {
5560
destination.Global = true
5661
}
62+
match = cursor.MatchAfterOptional(whitespaceMatcher, setKeywordMatcher)
63+
if match.Code != setKeyword {
64+
return cursor.NewError(setKeywordMatcher)
65+
}
66+
67+
match = cursor.MatchAfterOptional(whitespaceMatcher, ttlKeywordMatcher)
68+
if match.Code == ttlKeyword {
69+
match = cursor.MatchAfterOptional(whitespaceMatcher, intLiteralMatcher)
70+
if match.Code != intLiteralMatcher.Code {
71+
return cursor.NewError(setKeywordMatcher)
72+
}
73+
74+
ttl64, err := match.Int(cursor)
75+
if err != nil {
76+
return fmt.Errorf("parseregisterset unable to get int value due to: %w", err)
77+
}
78+
destination.TTL = int(ttl64)
79+
}
80+
5781
match = cursor.MatchAfterOptional(whitespaceMatcher, selectorMatcher)
5882
if match.Code != selectorTokenCode {
5983
return cursor.NewError(selectorMatcher)

schema/register.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@ type Register struct {
66
Global bool
77
Spec string
88
}
9+
10+
type RegisterSet struct {
11+
Register
12+
TTL int
13+
}

0 commit comments

Comments
 (0)