Skip to content

Commit 3789882

Browse files
author
TOGASHI Tomoki
authored
feat(spanner/spansql): add support for bit functions, sequence functions and GENERATE_UUID (#8482)
* feat(spanner/spansql): add support for bit functions and sequence functions * feat(spanner/spansql): add support for function GENERATE_UUID
1 parent 8c1a363 commit 3789882

File tree

5 files changed

+39
-0
lines changed

5 files changed

+39
-0
lines changed

spanner/spansql/keywords.go

+14
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ func init() {
145145
// Spacial case of INTERVAL arg for TIMESTAMP_ADD, TIMESTAMP_SUB
146146
funcArgParsers["TIMESTAMP_ADD"] = timestampIntervalArgParser
147147
funcArgParsers["TIMESTAMP_SUB"] = timestampIntervalArgParser
148+
// Special case of SEQUENCE arg for GET_NEXT_SEQUENCE_VALUE, GET_INTERNAL_SEQUENCE_STATE
149+
funcArgParsers["GET_NEXT_SEQUENCE_VALUE"] = sequenceArgParser
150+
funcArgParsers["GET_INTERNAL_SEQUENCE_STATE"] = sequenceArgParser
148151
}
149152

150153
var allFuncs = []string{
@@ -280,4 +283,15 @@ var allFuncs = []string{
280283

281284
// JSON functions.
282285
"JSON_VALUE",
286+
287+
// Bit functions.
288+
"BIT_COUNT",
289+
"BIT_REVERSE",
290+
291+
// Sequence functions.
292+
"GET_NEXT_SEQUENCE_VALUE",
293+
"GET_INTERNAL_SEQUENCE_STATE",
294+
295+
// Utility functions.
296+
"GENERATE_UUID",
283297
}

spanner/spansql/parser.go

+11
Original file line numberDiff line numberDiff line change
@@ -3386,6 +3386,17 @@ var dateIntervalArgParser = intervalArgParser((*parser).parseDateIntervalDatePar
33863386
// Special argument parser for TIMESTAMP_ADD, TIMESTAMP_SUB
33873387
var timestampIntervalArgParser = intervalArgParser((*parser).parseTimestampIntervalDatePart)
33883388

3389+
var sequenceArgParser = func(p *parser) (Expr, *parseError) {
3390+
if p.eat("SEQUENCE") {
3391+
name, err := p.parseTableOrIndexOrColumnName()
3392+
if err != nil {
3393+
return nil, err
3394+
}
3395+
return SequenceExpr{Name: name}, nil
3396+
}
3397+
return p.parseExpr()
3398+
}
3399+
33893400
/*
33903401
Expressions
33913402

spanner/spansql/parser_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ func TestParseExpr(t *testing.T) {
416416
{`GENERATE_DATE_ARRAY('2022-01-01', CURRENT_DATE(), INTERVAL 1 MONTH)`, Func{Name: "GENERATE_DATE_ARRAY", Args: []Expr{StringLiteral("2022-01-01"), Func{Name: "CURRENT_DATE"}, IntervalExpr{Expr: IntegerLiteral(1), DatePart: "MONTH"}}}},
417417
{`TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)`, Func{Name: "TIMESTAMP_ADD", Args: []Expr{Func{Name: "CURRENT_TIMESTAMP"}, IntervalExpr{Expr: IntegerLiteral(1), DatePart: "HOUR"}}}},
418418
{`TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 MINUTE)`, Func{Name: "TIMESTAMP_SUB", Args: []Expr{Func{Name: "CURRENT_TIMESTAMP"}, IntervalExpr{Expr: IntegerLiteral(1), DatePart: "MINUTE"}}}},
419+
{`GET_NEXT_SEQUENCE_VALUE(SEQUENCE MySequence)`, Func{Name: "GET_NEXT_SEQUENCE_VALUE", Args: []Expr{SequenceExpr{Name: ID("MySequence")}}}},
420+
{`GET_INTERNAL_SEQUENCE_STATE(SEQUENCE MySequence)`, Func{Name: "GET_INTERNAL_SEQUENCE_STATE", Args: []Expr{SequenceExpr{Name: ID("MySequence")}}}},
419421

420422
// Conditional expressions
421423
{

spanner/spansql/sql.go

+6
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,12 @@ func (ie IntervalExpr) addSQL(sb *strings.Builder) {
892892
sb.WriteString(ie.DatePart)
893893
}
894894

895+
func (se SequenceExpr) SQL() string { return buildSQL(se) }
896+
func (se SequenceExpr) addSQL(sb *strings.Builder) {
897+
sb.WriteString("SEQUENCE ")
898+
sb.WriteString(se.Name.SQL())
899+
}
900+
895901
func idList(l []ID, join string) string {
896902
var ss []string
897903
for _, s := range l {

spanner/spansql/types.go

+6
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,12 @@ type IntervalExpr struct {
798798
func (IntervalExpr) isBoolExpr() {} // possibly bool
799799
func (IntervalExpr) isExpr() {}
800800

801+
type SequenceExpr struct {
802+
Name ID
803+
}
804+
805+
func (SequenceExpr) isExpr() {}
806+
801807
// Paren represents a parenthesised expression.
802808
type Paren struct {
803809
Expr Expr

0 commit comments

Comments
 (0)