Skip to content

Commit 46ee554

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 721bb1a commit 46ee554

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
@@ -1507,6 +1507,7 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15071507
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.With")
15081508
}
15091509
}
1510+
15101511
for i, stmt := range n.Selects {
15111512
switch selectStmt := stmt.(type) {
15121513
case *SelectStmt:
@@ -1528,6 +1529,20 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error {
15281529
ctx.WritePlain(")")
15291530
}
15301531
}
1532+
1533+
if n.OrderBy != nil {
1534+
ctx.WritePlain(" ")
1535+
if err := n.OrderBy.Restore(ctx); err != nil {
1536+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.OrderBy")
1537+
}
1538+
}
1539+
1540+
if n.Limit != nil {
1541+
ctx.WritePlain(" ")
1542+
if err := n.Limit.Restore(ctx); err != nil {
1543+
return errors.Annotate(err, "An error occurred while restore SetOprSelectList.Limit")
1544+
}
1545+
}
15311546
return nil
15321547
}
15331548

@@ -1552,6 +1567,20 @@ func (n *SetOprSelectList) Accept(v Visitor) (Node, bool) {
15521567
}
15531568
n.Selects[i] = node
15541569
}
1570+
if n.OrderBy != nil {
1571+
node, ok := n.OrderBy.Accept(v)
1572+
if !ok {
1573+
return n, false
1574+
}
1575+
n.OrderBy = node.(*OrderByClause)
1576+
}
1577+
if n.Limit != nil {
1578+
node, ok := n.Limit.Accept(v)
1579+
if !ok {
1580+
return n, false
1581+
}
1582+
n.Limit = node.(*Limit)
1583+
}
15551584
return v.Leave(n)
15561585
}
15571586

parser/parser.y

+25-22
Original file line numberDiff line numberDiff line change
@@ -9341,15 +9341,19 @@ SetOprStmtWithLimitOrderBy:
93419341
}
93429342
var setOprList2 []ast.Node
93439343
var with2 *ast.WithClause
9344+
var limit2 *ast.Limit
9345+
var orderBy2 *ast.OrderByClause
93449346
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
93459347
case *ast.SelectStmt:
93469348
setOprList2 = []ast.Node{x}
93479349
with2 = x.With
93489350
case *ast.SetOprStmt:
93499351
setOprList2 = x.SelectList.Selects
93509352
with2 = x.With
9353+
limit2 = x.Limit
9354+
orderBy2 = x.OrderBy
93519355
}
9352-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9356+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
93539357
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
93549358
setOprList := append(setOprList1, nextSetOprList)
93559359
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9365,15 +9369,19 @@ SetOprStmtWithLimitOrderBy:
93659369
}
93669370
var setOprList2 []ast.Node
93679371
var with2 *ast.WithClause
9372+
var limit2 *ast.Limit
9373+
var orderBy2 *ast.OrderByClause
93689374
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
93699375
case *ast.SelectStmt:
93709376
setOprList2 = []ast.Node{x}
93719377
with2 = x.With
93729378
case *ast.SetOprStmt:
93739379
setOprList2 = x.SelectList.Selects
93749380
with2 = x.With
9381+
limit2 = x.Limit
9382+
orderBy2 = x.OrderBy
93759383
}
9376-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9384+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
93779385
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
93789386
setOprList := append(setOprList1, nextSetOprList)
93799387
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9389,15 +9397,19 @@ SetOprStmtWithLimitOrderBy:
93899397
}
93909398
var setOprList2 []ast.Node
93919399
var with2 *ast.WithClause
9400+
var limit2 *ast.Limit
9401+
var orderBy2 *ast.OrderByClause
93929402
switch x := $3.(*ast.SubqueryExpr).Query.(type) {
93939403
case *ast.SelectStmt:
93949404
setOprList2 = []ast.Node{x}
93959405
with2 = x.With
93969406
case *ast.SetOprStmt:
93979407
setOprList2 = x.SelectList.Selects
93989408
with2 = x.With
9409+
limit2 = x.Limit
9410+
orderBy2 = x.OrderBy
93999411
}
9400-
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2}
9412+
nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2}
94019413
nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType)
94029414
setOprList := append(setOprList1, nextSetOprList)
94039415
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
@@ -9408,48 +9420,39 @@ SetOprStmtWithLimitOrderBy:
94089420
| SubSelect OrderBy
94099421
{
94109422
var setOprList []ast.Node
9411-
var with *ast.WithClause
94129423
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
94139424
case *ast.SelectStmt:
9414-
setOprList = []ast.Node{x}
9415-
with = x.With
9425+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
94169426
case *ast.SetOprStmt:
9417-
setOprList = x.SelectList.Selects
9418-
with = x.With
9427+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
94199428
}
9420-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9429+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
94219430
setOpr.OrderBy = $2.(*ast.OrderByClause)
94229431
$$ = setOpr
94239432
}
94249433
| SubSelect SelectStmtLimit
94259434
{
94269435
var setOprList []ast.Node
9427-
var with *ast.WithClause
94289436
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
94299437
case *ast.SelectStmt:
9430-
setOprList = []ast.Node{x}
9431-
with = x.With
9438+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
94329439
case *ast.SetOprStmt:
9433-
setOprList = x.SelectList.Selects
9434-
with = x.With
9440+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
94359441
}
9436-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9442+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
94379443
setOpr.Limit = $2.(*ast.Limit)
94389444
$$ = setOpr
94399445
}
94409446
| SubSelect OrderBy SelectStmtLimit
94419447
{
94429448
var setOprList []ast.Node
9443-
var with *ast.WithClause
94449449
switch x := $1.(*ast.SubqueryExpr).Query.(type) {
94459450
case *ast.SelectStmt:
9446-
setOprList = []ast.Node{x}
9447-
with = x.With
9451+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}}
94489452
case *ast.SetOprStmt:
9449-
setOprList = x.SelectList.Selects
9450-
with = x.With
9453+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
94519454
}
9452-
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with}
9455+
setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}}
94539456
setOpr.OrderBy = $2.(*ast.OrderByClause)
94549457
setOpr.Limit = $3.(*ast.Limit)
94559458
$$ = setOpr
@@ -9486,7 +9489,7 @@ SetOprClause:
94869489
case *ast.SelectStmt:
94879490
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}}
94889491
case *ast.SetOprStmt:
9489-
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}}
9492+
setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}}
94909493
}
94919494
$$ = setOprList
94929495
}

parser/parser_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -4460,6 +4460,16 @@ func TestSetOperator(t *testing.T) {
44604460
{"(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"},
44614461
{"((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"},
44624462
{"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)"},
4463+
4464+
// https://github.com/pingcap/tidb/issues/49874
4465+
{"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,
4466+
"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)"},
4467+
{"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,
4468+
"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"},
4469+
{"(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,
4470+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"},
4471+
{"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk", true,
4472+
"(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk`"},
44634473
}
44644474
RunTest(t, table, false)
44654475
}

0 commit comments

Comments
 (0)