Skip to content

Commit d6aeaf0

Browse files
authored
parser: fix limit lost in SetOprStmt (#49898)
close #49874
1 parent 8eed043 commit d6aeaf0

File tree

4 files changed

+89
-44
lines changed

4 files changed

+89
-44
lines changed

pkg/parser/ast/dml.go

+29
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,7 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15691569
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.With")
15701570
}
15711571
}
1572+
15721573
for i, stmt := range n.Selects {
15731574
switch selectStmt := stmt.(type) {
15741575
case *SelectStmt:
@@ -1590,6 +1591,20 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15901591
ctx.WritePlain(")")
15911592
}
15921593
}
1594+
1595+
if n.OrderBy != nil {
1596+
ctx.WritePlain(" ")
1597+
if err := n.OrderBy.Restore(ctx); err != nil {
1598+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.OrderBy")
1599+
}
1600+
}
1601+
1602+
if n.Limit != nil {
1603+
ctx.WritePlain(" ")
1604+
if err := n.Limit.Restore(ctx); err != nil {
1605+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.Limit")
1606+
}
1607+
}
15931608
return nil
15941609
}
15951610

@@ -1614,6 +1629,20 @@ func (n *SetOprSelectList) Accept(v Visitor) (Node, bool) {
16141629
}
16151630
n.Selects[i] = node
16161631
}
1632+
if n.OrderBy != nil {
1633+
node, ok := n.OrderBy.Accept(v)
1634+
if !ok {
1635+
return n, false
1636+
}
1637+
n.OrderBy = node.(*OrderByClause)
1638+
}
1639+
if n.Limit != nil {
1640+
node, ok := n.Limit.Accept(v)
1641+
if !ok {
1642+
return n, false
1643+
}
1644+
n.Limit = node.(*Limit)
1645+
}
16171646
return v.Leave(n)
16181647
}
16191648

pkg/parser/parser.go

+25-22
Original file line numberDiff line numberDiff line change
@@ -19931,15 +19931,19 @@ yynewstate:
1993119931
}
1993219932
var setOprList2 []ast.Node
1993319933
var with2 *ast.WithClause
19934+
var limit2 *ast.Limit
19935+
var orderBy2 *ast.OrderByClause
1993419936
switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) {
1993519937
case *ast.SelectStmt:
1993619938
setOprList2 = []ast.Node{x}
1993719939
with2 = x.With
1993819940
case *ast.SetOprStmt:
1993919941
setOprList2 = x.SelectList.Selects
1994019942
with2 = x.With
19943+
limit2 = x.Limit
19944+
orderBy2 = x.OrderBy
1994119945
}
19942-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
19946+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1994319947
nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType)
1994419948
setOprList := append(setOprList1, nextSetOprList)
1994519949
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -19955,15 +19959,19 @@ yynewstate:
1995519959
}
1995619960
var setOprList2 []ast.Node
1995719961
var with2 *ast.WithClause
19962+
var limit2 *ast.Limit
19963+
var orderBy2 *ast.OrderByClause
1995819964
switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) {
1995919965
case *ast.SelectStmt:
1996019966
setOprList2 = []ast.Node{x}
1996119967
with2 = x.With
1996219968
case *ast.SetOprStmt:
1996319969
setOprList2 = x.SelectList.Selects
1996419970
with2 = x.With
19971+
limit2 = x.Limit
19972+
orderBy2 = x.OrderBy
1996519973
}
19966-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
19974+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1996719975
nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType)
1996819976
setOprList := append(setOprList1, nextSetOprList)
1996919977
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -19979,15 +19987,19 @@ yynewstate:
1997919987
}
1998019988
var setOprList2 []ast.Node
1998119989
var with2 *ast.WithClause
19990+
var limit2 *ast.Limit
19991+
var orderBy2 *ast.OrderByClause
1998219992
switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) {
1998319993
case *ast.SelectStmt:
1998419994
setOprList2 = []ast.Node{x}
1998519995
with2 = x.With
1998619996
case *ast.SetOprStmt:
1998719997
setOprList2 = x.SelectList.Selects
1998819998
with2 = x.With
19999+
limit2 = x.Limit
20000+
orderBy2 = x.OrderBy
1998920001
}
19990-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
20002+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1999120003
nextSetOprList.AfterSetOperator = yyS[yypt-3].item.(*ast.SetOprType)
1999220004
setOprList := append(setOprList1, nextSetOprList)
1999320005
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -19998,48 +20010,39 @@ yynewstate:
1999820010
case 1842:
1999920011
{
2000020012
var setOprList []ast.Node
20001-
var with *ast.WithClause
2000220013
switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) {
2000320014
case *ast.SelectStmt:
20004-
setOprList = []ast.Node{x}
20005-
with = x.With
20015+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
2000620016
case *ast.SetOprStmt:
20007-
setOprList = x.SelectList.Selects
20008-
with = x.With
20017+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
2000920018
}
20010-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
20019+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
2001120020
setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause)
2001220021
parser.yyVAL.statement = setOpr
2001320022
}
2001420023
case 1843:
2001520024
{
2001620025
var setOprList []ast.Node
20017-
var with *ast.WithClause
2001820026
switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) {
2001920027
case *ast.SelectStmt:
20020-
setOprList = []ast.Node{x}
20021-
with = x.With
20028+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
2002220029
case *ast.SetOprStmt:
20023-
setOprList = x.SelectList.Selects
20024-
with = x.With
20030+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
2002520031
}
20026-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
20032+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
2002720033
setOpr.Limit = yyS[yypt-0].item.(*ast.Limit)
2002820034
parser.yyVAL.statement = setOpr
2002920035
}
2003020036
case 1844:
2003120037
{
2003220038
var setOprList []ast.Node
20033-
var with *ast.WithClause
2003420039
switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) {
2003520040
case *ast.SelectStmt:
20036-
setOprList = []ast.Node{x}
20037-
with = x.With
20041+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
2003820042
case *ast.SetOprStmt:
20039-
setOprList = x.SelectList.Selects
20040-
with = x.With
20043+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
2004120044
}
20042-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
20045+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
2004320046
setOpr.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause)
2004420047
setOpr.Limit = yyS[yypt-0].item.(*ast.Limit)
2004520048
parser.yyVAL.statement = setOpr
@@ -20071,7 +20074,7 @@ yynewstate:
2007120074
case *ast.SelectStmt:
2007220075
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}}
2007320076
case *ast.SetOprStmt:
20074-
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}}
20077+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
2007520078
}
2007620079
parser.yyVAL.item = setOprList
2007720080
}

pkg/parser/parser.y

+25-22
Original file line numberDiff line numberDiff line change
@@ -10260,15 +10260,19 @@ SetOprStmtWithLimitOrderBy:
1026010260
}
1026110261
var setOprList2 []ast.Node
1026210262
var with2 *ast.WithClause
10263+
var limit2 *ast.Limit
10264+
var orderBy2 *ast.OrderByClause
1026310265
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
1026410266
case *ast.SelectStmt:
1026510267
setOprList2 = []ast.Node{x}
1026610268
with2 = x.With
1026710269
case *ast.SetOprStmt:
1026810270
setOprList2 = x.SelectList.Selects
1026910271
with2 = x.With
10272+
limit2 = x.Limit
10273+
orderBy2 = x.OrderBy
1027010274
}
10271-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
10275+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1027210276
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
1027310277
setOprList := append(setOprList1, nextSetOprList)
1027410278
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -10284,15 +10288,19 @@ SetOprStmtWithLimitOrderBy:
1028410288
}
1028510289
var setOprList2 []ast.Node
1028610290
var with2 *ast.WithClause
10291+
var limit2 *ast.Limit
10292+
var orderBy2 *ast.OrderByClause
1028710293
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
1028810294
case *ast.SelectStmt:
1028910295
setOprList2 = []ast.Node{x}
1029010296
with2 = x.With
1029110297
case *ast.SetOprStmt:
1029210298
setOprList2 = x.SelectList.Selects
1029310299
with2 = x.With
10300+
limit2 = x.Limit
10301+
orderBy2 = x.OrderBy
1029410302
}
10295-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
10303+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1029610304
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
1029710305
setOprList := append(setOprList1, nextSetOprList)
1029810306
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -10308,15 +10316,19 @@ SetOprStmtWithLimitOrderBy:
1030810316
}
1030910317
var setOprList2 []ast.Node
1031010318
var with2 *ast.WithClause
10319+
var limit2 *ast.Limit
10320+
var orderBy2 *ast.OrderByClause
1031110321
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
1031210322
case *ast.SelectStmt:
1031310323
setOprList2 = []ast.Node{x}
1031410324
with2 = x.With
1031510325
case *ast.SetOprStmt:
1031610326
setOprList2 = x.SelectList.Selects
1031710327
with2 = x.With
10328+
limit2 = x.Limit
10329+
orderBy2 = x.OrderBy
1031810330
}
10319-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
10331+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
1032010332
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
1032110333
setOprList := append(setOprList1, nextSetOprList)
1032210334
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -10327,48 +10339,39 @@ SetOprStmtWithLimitOrderBy:
1032710339
| SubSelect OrderBy
1032810340
{
1032910341
var setOprList []ast.Node
10330-
var with *ast.WithClause
1033110342
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
1033210343
case *ast.SelectStmt:
10333-
setOprList = []ast.Node{x}
10334-
with = x.With
10344+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
1033510345
case *ast.SetOprStmt:
10336-
setOprList = x.SelectList.Selects
10337-
with = x.With
10346+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
1033810347
}
10339-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
10348+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
1034010349
setOpr.OrderBy = $2.(*ast.OrderByClause)
1034110350
$$ = setOpr
1034210351
}
1034310352
| SubSelect SelectStmtLimit
1034410353
{
1034510354
var setOprList []ast.Node
10346-
var with *ast.WithClause
1034710355
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
1034810356
case *ast.SelectStmt:
10349-
setOprList = []ast.Node{x}
10350-
with = x.With
10357+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
1035110358
case *ast.SetOprStmt:
10352-
setOprList = x.SelectList.Selects
10353-
with = x.With
10359+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
1035410360
}
10355-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
10361+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
1035610362
setOpr.Limit = $2.(*ast.Limit)
1035710363
$$ = setOpr
1035810364
}
1035910365
| SubSelect OrderBy SelectStmtLimit
1036010366
{
1036110367
var setOprList []ast.Node
10362-
var with *ast.WithClause
1036310368
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
1036410369
case *ast.SelectStmt:
10365-
setOprList = []ast.Node{x}
10366-
with = x.With
10370+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
1036710371
case *ast.SetOprStmt:
10368-
setOprList = x.SelectList.Selects
10369-
with = x.With
10372+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
1037010373
}
10371-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
10374+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
1037210375
setOpr.OrderBy = $2.(*ast.OrderByClause)
1037310376
setOpr.Limit = $3.(*ast.Limit)
1037410377
$$ = setOpr
@@ -10405,7 +10408,7 @@ SetOprClause:
1040510408
case *ast.SelectStmt:
1040610409
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}}
1040710410
case *ast.SetOprStmt:
10408-
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}}
10411+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
1040910412
}
1041010413
$$ = setOprList
1041110414
}

pkg/parser/parser_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -5155,6 +5155,16 @@ func TestSetOperator(t *testing.T) {
51555155
{"(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"},
51565156
{"((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"},
51575157
{"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)"},
5158+
5159+
// https://github.com/pingcap/tidb/issues/49874
5160+
{"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,
5161+
"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)"},
5162+
{"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,
5163+
"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"},
5164+
{"(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,
5165+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"},
5166+
{"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk", true,
5167+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk`"},
51585168
}
51595169
RunTest(t, table, false)
51605170
}

0 commit comments

Comments
 (0)