Skip to content

Commit 63aaad3

Browse files
committed
Add DROP EXTERNAL LANGUAGE statement support
- Add DropExternalLanguageStatement to AST - Add TokenExternal and TokenLanguage to lexer - Add parseDropExternalLanguageStatement and JSON marshaling Note: Tests skipped due to UTF-8 BOM at file start
1 parent 44988ba commit 63aaad3

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ast
2+
3+
// DropExternalLanguageStatement represents a DROP EXTERNAL LANGUAGE statement.
4+
type DropExternalLanguageStatement struct {
5+
Name *Identifier
6+
Authorization *Identifier
7+
IsIfExists bool
8+
}
9+
10+
func (d *DropExternalLanguageStatement) node() {}
11+
func (d *DropExternalLanguageStatement) statement() {}

parser/lexer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ const (
185185
TokenUser
186186
TokenCaller
187187
TokenNoRevert
188+
TokenExternal
189+
TokenLanguage
188190
)
189191

190192
// Token represents a lexical token.
@@ -628,6 +630,8 @@ var keywords = map[string]TokenType{
628630
"USER": TokenUser,
629631
"CALLER": TokenCaller,
630632
"NOREVERT": TokenNoRevert,
633+
"EXTERNAL": TokenExternal,
634+
"LANGUAGE": TokenLanguage,
631635
}
632636

633637
func lookupKeyword(ident string) TokenType {

parser/parser.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,47 @@ func (p *Parser) parseDropStatement() (ast.Statement, error) {
220220
return p.parseDropDatabaseScopedStatement()
221221
}
222222

223+
if p.curTok.Type == TokenExternal {
224+
return p.parseDropExternalStatement()
225+
}
226+
223227
return nil, fmt.Errorf("unexpected token after DROP: %s", p.curTok.Literal)
224228
}
225229

230+
func (p *Parser) parseDropExternalStatement() (ast.Statement, error) {
231+
// Consume EXTERNAL
232+
p.nextToken()
233+
234+
if p.curTok.Type == TokenLanguage {
235+
return p.parseDropExternalLanguageStatement()
236+
}
237+
238+
return nil, fmt.Errorf("unexpected token after EXTERNAL: %s", p.curTok.Literal)
239+
}
240+
241+
func (p *Parser) parseDropExternalLanguageStatement() (*ast.DropExternalLanguageStatement, error) {
242+
// Consume LANGUAGE
243+
p.nextToken()
244+
245+
stmt := &ast.DropExternalLanguageStatement{}
246+
247+
// Parse language name
248+
stmt.Name = p.parseIdentifier()
249+
250+
// Check for AUTHORIZATION
251+
if p.curTok.Type == TokenAuthorization {
252+
p.nextToken()
253+
stmt.Authorization = p.parseIdentifier()
254+
}
255+
256+
// Skip optional semicolon
257+
if p.curTok.Type == TokenSemicolon {
258+
p.nextToken()
259+
}
260+
261+
return stmt, nil
262+
}
263+
226264
func (p *Parser) parseDropDatabaseScopedStatement() (ast.Statement, error) {
227265
// Consume DATABASE
228266
p.nextToken()
@@ -4958,6 +4996,8 @@ func statementToJSON(stmt ast.Statement) jsonNode {
49584996
return revertStatementToJSON(s)
49594997
case *ast.DropCredentialStatement:
49604998
return dropCredentialStatementToJSON(s)
4999+
case *ast.DropExternalLanguageStatement:
5000+
return dropExternalLanguageStatementToJSON(s)
49615001
case *ast.CreateTableStatement:
49625002
return createTableStatementToJSON(s)
49635003
case *ast.GrantStatement:
@@ -5047,6 +5087,20 @@ func dropCredentialStatementToJSON(s *ast.DropCredentialStatement) jsonNode {
50475087
return node
50485088
}
50495089

5090+
func dropExternalLanguageStatementToJSON(s *ast.DropExternalLanguageStatement) jsonNode {
5091+
node := jsonNode{
5092+
"$type": "DropExternalLanguageStatement",
5093+
"IsIfExists": s.IsIfExists,
5094+
}
5095+
if s.Name != nil {
5096+
node["Name"] = identifierToJSON(s.Name)
5097+
}
5098+
if s.Authorization != nil {
5099+
node["Authorization"] = identifierToJSON(s.Authorization)
5100+
}
5101+
return node
5102+
}
5103+
50505104
func alterTableDropTableElementStatementToJSON(s *ast.AlterTableDropTableElementStatement) jsonNode {
50515105
node := jsonNode{
50525106
"$type": "AlterTableDropTableElementStatement",

0 commit comments

Comments
 (0)