@@ -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.
875887func (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
0 commit comments