Skip to content

Commit 5adafaf

Browse files
authored
parser: support RETURNING clause syntax (#65633)
1 parent aaa5331 commit 5adafaf

7 files changed

Lines changed: 11574 additions & 11415 deletions

File tree

pkg/parser/ast/dml.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,18 @@ func (n *FieldList) Restore(ctx *format.RestoreCtx) error {
871871
return nil
872872
}
873873

874+
func restoreReturningFields(ctx *format.RestoreCtx, fields []*SelectField) error {
875+
for i, field := range fields {
876+
if i != 0 {
877+
ctx.WritePlain(", ")
878+
}
879+
if err := field.Restore(ctx); err != nil {
880+
return errors.Annotatef(err, "An error occurred while restore Returning[%d]", i)
881+
}
882+
}
883+
return nil
884+
}
885+
874886
// Accept implements Node Accept interface.
875887
func (n *FieldList) Accept(v Visitor) (Node, bool) {
876888
newNode, skipChildren := v.Enter(n)
@@ -2401,6 +2413,8 @@ type InsertStmt struct {
24012413
// TableHints represents the table level Optimizer Hint for join type.
24022414
TableHints []*TableOptimizerHint
24032415
PartitionNames []CIStr
2416+
// Returning represents the RETURNING select_expr list for INSERT statement.
2417+
Returning []*SelectField
24042418
}
24052419

24062420
// Restore implements Node interface.
@@ -2526,6 +2540,12 @@ func (n *InsertStmt) Restore(ctx *format.RestoreCtx) error {
25262540
}
25272541
}
25282542
}
2543+
if len(n.Returning) > 0 {
2544+
ctx.WriteKeyWord(" RETURNING ")
2545+
if err := restoreReturningFields(ctx, n.Returning); err != nil {
2546+
return errors.Annotate(err, "An error occurred while restore InsertStmt.Returning")
2547+
}
2548+
}
25292549

25302550
return nil
25312551
}
@@ -2575,6 +2595,13 @@ func (n *InsertStmt) Accept(v Visitor) (Node, bool) {
25752595
}
25762596
n.OnDuplicate[i] = node.(*Assignment)
25772597
}
2598+
for i, field := range n.Returning {
2599+
node, ok := field.Accept(v)
2600+
if !ok {
2601+
return n, false
2602+
}
2603+
n.Returning[i] = node.(*SelectField)
2604+
}
25782605
return v.Leave(n)
25792606
}
25802607

@@ -2634,6 +2661,8 @@ type DeleteStmt struct {
26342661
// TableHints represents the table level Optimizer Hint for join type.
26352662
TableHints []*TableOptimizerHint
26362663
With *WithClause
2664+
// Returning represents the RETURNING select_expr list for DELETE statement.
2665+
Returning []*SelectField
26372666
}
26382667

26392668
// Restore implements Node interface.
@@ -2723,6 +2752,12 @@ func (n *DeleteStmt) Restore(ctx *format.RestoreCtx) error {
27232752
return errors.Annotate(err, "An error occurred while restore DeleteStmt.Limit")
27242753
}
27252754
}
2755+
if len(n.Returning) > 0 {
2756+
ctx.WriteKeyWord(" RETURNING ")
2757+
if err := restoreReturningFields(ctx, n.Returning); err != nil {
2758+
return errors.Annotate(err, "An error occurred while restore DeleteStmt.Returning")
2759+
}
2760+
}
27262761

27272762
return nil
27282763
}
@@ -2777,6 +2812,13 @@ func (n *DeleteStmt) Accept(v Visitor) (Node, bool) {
27772812
}
27782813
n.Limit = node.(*Limit)
27792814
}
2815+
for i, field := range n.Returning {
2816+
node, ok = field.Accept(v)
2817+
if !ok {
2818+
return n, false
2819+
}
2820+
n.Returning[i] = node.(*SelectField)
2821+
}
27802822
return v.Leave(n)
27812823
}
27822824

@@ -2886,6 +2928,8 @@ type UpdateStmt struct {
28862928
MultipleTable bool
28872929
TableHints []*TableOptimizerHint
28882930
With *WithClause
2931+
// Returning represents the RETURNING select_expr list for UPDATE statement.
2932+
Returning []*SelectField
28892933
}
28902934

28912935
// Restore implements Node interface.
@@ -2964,6 +3008,12 @@ func (n *UpdateStmt) Restore(ctx *format.RestoreCtx) error {
29643008
return errors.Annotate(err, "An error occur while restore UpdateStmt.Limit")
29653009
}
29663010
}
3011+
if len(n.Returning) > 0 {
3012+
ctx.WriteKeyWord(" RETURNING ")
3013+
if err := restoreReturningFields(ctx, n.Returning); err != nil {
3014+
return errors.Annotate(err, "An error occurred while restore UpdateStmt.Returning")
3015+
}
3016+
}
29673017

29683018
return nil
29693019
}
@@ -3015,6 +3065,13 @@ func (n *UpdateStmt) Accept(v Visitor) (Node, bool) {
30153065
}
30163066
n.Limit = node.(*Limit)
30173067
}
3068+
for i, field := range n.Returning {
3069+
node, ok = field.Accept(v)
3070+
if !ok {
3071+
return n, false
3072+
}
3073+
n.Returning[i] = node.(*SelectField)
3074+
}
30183075
return v.Leave(n)
30193076
}
30203077

pkg/parser/keywords.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/parser/keywords_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func TestKeywords(t *testing.T) {
3636
}
3737

3838
func TestKeywordsLength(t *testing.T) {
39-
require.Equal(t, 679, len(parser.Keywords))
39+
require.Equal(t, 680, len(parser.Keywords))
4040

4141
reservedNr := 0
4242
for _, kw := range parser.Keywords {

pkg/parser/misc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ var tokenMap = map[string]int{
709709
"RESTORES": restores,
710710
"RESTORED_TS": restoredTS,
711711
"RESTRICT": restrict,
712+
"RETURNING": returning,
712713
"REVERSE": reverse,
713714
"REVOKE": revoke,
714715
"RIGHT": right,

0 commit comments

Comments
 (0)