Skip to content

Commit 6567c55

Browse files
Defined2014ti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#49898
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
1 parent cd073ea commit 6567c55

File tree

4 files changed

+24952
-22
lines changed

4 files changed

+24952
-22
lines changed

parser/ast/dml.go

+29
Original file line numberDiff line numberDiff line change
@@ -1552,6 +1552,7 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15521552
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.With")
15531553
}
15541554
}
1555+
15551556
for i, stmt := range n.Selects {
15561557
switch selectStmt := stmt.(type) {
15571558
case *SelectStmt:
@@ -1573,6 +1574,20 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15731574
ctx.WritePlain(")")
15741575
}
15751576
}
1577+
1578+
if n.OrderBy != nil {
1579+
ctx.WritePlain(" ")
1580+
if err := n.OrderBy.Restore(ctx); err != nil {
1581+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.OrderBy")
1582+
}
1583+
}
1584+
1585+
if n.Limit != nil {
1586+
ctx.WritePlain(" ")
1587+
if err := n.Limit.Restore(ctx); err != nil {
1588+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.Limit")
1589+
}
1590+
}
15761591
return nil
15771592
}
15781593

@@ -1597,6 +1612,20 @@ func (n *SetOprSelectList) Accept(v Visitor) (Node, bool) {
15971612
}
15981613
n.Selects[i] = node
15991614
}
1615+
if n.OrderBy != nil {
1616+
node, ok := n.OrderBy.Accept(v)
1617+
if !ok {
1618+
return n, false
1619+
}
1620+
n.OrderBy = node.(*OrderByClause)
1621+
}
1622+
if n.Limit != nil {
1623+
node, ok := n.Limit.Accept(v)
1624+
if !ok {
1625+
return n, false
1626+
}
1627+
n.Limit = node.(*Limit)
1628+
}
16001629
return v.Leave(n)
16011630
}
16021631

parser/parser.y

+25-22
Original file line numberDiff line numberDiff line change
@@ -9785,15 +9785,19 @@ SetOprStmtWithLimitOrderBy:
97859785
}
97869786
var setOprList2 []ast.Node
97879787
var with2 *ast.WithClause
9788+
var limit2 *ast.Limit
9789+
var orderBy2 *ast.OrderByClause
97889790
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
97899791
case *ast.SelectStmt:
97909792
setOprList2 = []ast.Node{x}
97919793
with2 = x.With
97929794
case *ast.SetOprStmt:
97939795
setOprList2 = x.SelectList.Selects
97949796
with2 = x.With
9797+
limit2 = x.Limit
9798+
orderBy2 = x.OrderBy
97959799
}
9796-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9800+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
97979801
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
97989802
setOprList := append(setOprList1, nextSetOprList)
97999803
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9809,15 +9813,19 @@ SetOprStmtWithLimitOrderBy:
98099813
}
98109814
var setOprList2 []ast.Node
98119815
var with2 *ast.WithClause
9816+
var limit2 *ast.Limit
9817+
var orderBy2 *ast.OrderByClause
98129818
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
98139819
case *ast.SelectStmt:
98149820
setOprList2 = []ast.Node{x}
98159821
with2 = x.With
98169822
case *ast.SetOprStmt:
98179823
setOprList2 = x.SelectList.Selects
98189824
with2 = x.With
9825+
limit2 = x.Limit
9826+
orderBy2 = x.OrderBy
98199827
}
9820-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9828+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
98219829
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
98229830
setOprList := append(setOprList1, nextSetOprList)
98239831
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9833,15 +9841,19 @@ SetOprStmtWithLimitOrderBy:
98339841
}
98349842
var setOprList2 []ast.Node
98359843
var with2 *ast.WithClause
9844+
var limit2 *ast.Limit
9845+
var orderBy2 *ast.OrderByClause
98369846
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
98379847
case *ast.SelectStmt:
98389848
setOprList2 = []ast.Node{x}
98399849
with2 = x.With
98409850
case *ast.SetOprStmt:
98419851
setOprList2 = x.SelectList.Selects
98429852
with2 = x.With
9853+
limit2 = x.Limit
9854+
orderBy2 = x.OrderBy
98439855
}
9844-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9856+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
98459857
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
98469858
setOprList := append(setOprList1, nextSetOprList)
98479859
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9852,48 +9864,39 @@ SetOprStmtWithLimitOrderBy:
98529864
| SubSelect OrderBy
98539865
{
98549866
var setOprList []ast.Node
9855-
var with *ast.WithClause
98569867
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
98579868
case *ast.SelectStmt:
9858-
setOprList = []ast.Node{x}
9859-
with = x.With
9869+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
98609870
case *ast.SetOprStmt:
9861-
setOprList = x.SelectList.Selects
9862-
with = x.With
9871+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
98639872
}
9864-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9873+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
98659874
setOpr.OrderBy = $2.(*ast.OrderByClause)
98669875
$$ = setOpr
98679876
}
98689877
| SubSelect SelectStmtLimit
98699878
{
98709879
var setOprList []ast.Node
9871-
var with *ast.WithClause
98729880
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
98739881
case *ast.SelectStmt:
9874-
setOprList = []ast.Node{x}
9875-
with = x.With
9882+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
98769883
case *ast.SetOprStmt:
9877-
setOprList = x.SelectList.Selects
9878-
with = x.With
9884+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
98799885
}
9880-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9886+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
98819887
setOpr.Limit = $2.(*ast.Limit)
98829888
$$ = setOpr
98839889
}
98849890
| SubSelect OrderBy SelectStmtLimit
98859891
{
98869892
var setOprList []ast.Node
9887-
var with *ast.WithClause
98889893
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
98899894
case *ast.SelectStmt:
9890-
setOprList = []ast.Node{x}
9891-
with = x.With
9895+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
98929896
case *ast.SetOprStmt:
9893-
setOprList = x.SelectList.Selects
9894-
with = x.With
9897+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
98959898
}
9896-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9899+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
98979900
setOpr.OrderBy = $2.(*ast.OrderByClause)
98989901
setOpr.Limit = $3.(*ast.Limit)
98999902
$$ = setOpr
@@ -9930,7 +9933,7 @@ SetOprClause:
99309933
case *ast.SelectStmt:
99319934
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}}
99329935
case *ast.SetOprStmt:
9933-
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}}
9936+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
99349937
}
99359938
$$ = setOprList
99369939
}

parser/parser_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -4920,6 +4920,16 @@ func TestSetOperator(t *testing.T) {
49204920
{"(select c1 from t1) union all (select c2 from t2 except select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION ALL (SELECT `c2` FROM `t2` EXCEPT SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"},
49214921
{"((select c1 from t1) except select c2 from t2) intersect all (select c3 from t3) order by c1 limit 1", true, "((SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2`) INTERSECT ALL (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"},
49224922
{"select 1 union distinct (select 1 except all select 1 intersect select 1)", true, "SELECT 1 UNION (SELECT 1 EXCEPT ALL SELECT 1 INTERSECT SELECT 1)"},
4923+
4924+
// https://github.com/pingcap/tidb/issues/49874
4925+
{"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1)", true,
4926+
"SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1)"},
4927+
{"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1) order by pk limit 2", true,
4928+
"SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"},
4929+
{"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk limit 2", true,
4930+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"},
4931+
{"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk", true,
4932+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk`"},
49234933
}
49244934
RunTest(t, table, false)
49254935
}

0 commit comments

Comments
 (0)