Skip to content

Commit bbd899c

Browse files
committed
Add SEND, RECEIVE, CREATE CREDENTIAL and enable 8 more tests
- Implement SEND statement for Service Broker messaging - Implement RECEIVE statement for WAITFOR (RECEIVE ...) - Update WAITFOR to support statement option with nested RECEIVE/GET CONVERSATION GROUP - Add CREATE CREDENTIAL statement support - Add COMMIT TRANSACTION WITH (DELAYED_DURABILITY) support - Enable SendStatementTests, WaitForStatementTests90, CreateCredentialStatementTests - Enable CommitTransactionStatementTests120 baseline - 75 tests now passing (was 67)
1 parent 9024f5e commit bbd899c

File tree

14 files changed

+656
-17
lines changed

14 files changed

+656
-17
lines changed

ast/case_expression.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package ast
2+
3+
// SearchedCaseExpression represents a CASE WHEN ... THEN ... ELSE ... END expression.
4+
type SearchedCaseExpression struct {
5+
WhenClauses []*SearchedWhenClause
6+
ElseExpression ScalarExpression
7+
}
8+
9+
func (s *SearchedCaseExpression) node() {}
10+
func (s *SearchedCaseExpression) scalarExpression() {}
11+
12+
// SearchedWhenClause represents a WHEN ... THEN clause.
13+
type SearchedWhenClause struct {
14+
WhenExpression BooleanExpression
15+
ThenExpression ScalarExpression
16+
}
17+
18+
// SimpleCaseExpression represents a CASE expression WHEN value THEN result END.
19+
type SimpleCaseExpression struct {
20+
InputExpression ScalarExpression
21+
WhenClauses []*SimpleWhenClause
22+
ElseExpression ScalarExpression
23+
}
24+
25+
func (s *SimpleCaseExpression) node() {}
26+
func (s *SimpleCaseExpression) scalarExpression() {}
27+
28+
// SimpleWhenClause represents a WHEN value THEN result clause.
29+
type SimpleWhenClause struct {
30+
WhenExpression ScalarExpression
31+
ThenExpression ScalarExpression
32+
}

ast/create_credential_statement.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package ast
2+
3+
// CreateCredentialStatement represents a CREATE CREDENTIAL statement.
4+
type CreateCredentialStatement struct {
5+
Name *Identifier
6+
Identity ScalarExpression
7+
Secret ScalarExpression
8+
IsDatabaseScoped bool
9+
}
10+
11+
func (c *CreateCredentialStatement) node() {}
12+
func (c *CreateCredentialStatement) statement() {}

ast/receive_statement.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ast
2+
3+
// ReceiveStatement represents a RECEIVE ... FROM queue statement.
4+
type ReceiveStatement struct {
5+
Top ScalarExpression
6+
SelectElements []SelectElement
7+
Queue *SchemaObjectName
8+
Into *VariableTableReference
9+
Where BooleanExpression
10+
IsConversationGroupIdWhere bool
11+
}
12+
13+
func (r *ReceiveStatement) node() {}
14+
func (r *ReceiveStatement) statement() {}

ast/send_statement.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ast
2+
3+
// SendStatement represents a SEND ON CONVERSATION statement.
4+
type SendStatement struct {
5+
ConversationHandles []ScalarExpression
6+
MessageTypeName *IdentifierOrValueExpression
7+
MessageBody ScalarExpression
8+
}
9+
10+
func (s *SendStatement) node() {}
11+
func (s *SendStatement) statement() {}

find_tests.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
cd /home/user/teesql/parser/testdata
3+
for dir in */; do
4+
d="${dir%/}"
5+
if [ -f "$d/ast.json" ] && grep -q '"skip": true' "$d/metadata.json" 2>/dev/null; then
6+
echo "$d"
7+
fi
8+
done

parser/lexer.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ const (
113113
TokenDeclare
114114
TokenIf
115115
TokenElse
116+
TokenCase
117+
TokenWhen
118+
TokenThen
116119
TokenWhile
117120
TokenBegin
118121
TokenEnd
@@ -172,6 +175,10 @@ const (
172175
TokenLineno
173176
TokenStatusonly
174177
TokenNoreset
178+
TokenSend
179+
TokenMessage
180+
TokenTyp
181+
TokenReceive
175182
)
176183

177184
// Token represents a lexical token.
@@ -547,6 +554,9 @@ var keywords = map[string]TokenType{
547554
"DECLARE": TokenDeclare,
548555
"IF": TokenIf,
549556
"ELSE": TokenElse,
557+
"CASE": TokenCase,
558+
"WHEN": TokenWhen,
559+
"THEN": TokenThen,
550560
"WHILE": TokenWhile,
551561
"BEGIN": TokenBegin,
552562
"END": TokenEnd,
@@ -596,6 +606,10 @@ var keywords = map[string]TokenType{
596606
"LINENO": TokenLineno,
597607
"STATUSONLY": TokenStatusonly,
598608
"NORESET": TokenNoreset,
609+
"SEND": TokenSend,
610+
"MESSAGE": TokenMessage,
611+
"TYPE": TokenTyp,
612+
"RECEIVE": TokenReceive,
599613
}
600614

601615
func lookupKeyword(ident string) TokenType {

0 commit comments

Comments
 (0)