Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

planner: check view recursion when building source from view #20398

Merged
merged 11 commits into from
Nov 12, 2020

Conversation

francis0407
Copy link
Member

What problem does this PR solve?

Issue Number: close #20368

Problem Summary:

create table a (a int);
create view b as select * from a;
create view c as select * from b;
drop table a;
rename table c to a;
select * from a;

TiDB server crashed with stack overflow when building source from recursive view.

What is changed and how it works?

What's Changed:

  1. Add a stack to record the views which are on building.
  2. Replace the error ErrNoSuchTable with ErrViewRecursive

How it Works:

  1. When we build source from view, we check if the view has already been on the build stack. If so, the view is defined recursively, and we return an ErrViewRecursive error.
  2. If the view is not on the stack, we push it the stack, and pop it after building.

Related changes

  • Need to cherry-pick to the release branch

Check List

Tests

  • Unit test

Side effects

  • Breaking backward compatibility. This PR makes the error message compatible with MySQL.

Release note

  • fix stack overflow when building recursive view.

@francis0407 francis0407 requested review from a team as code owners October 11, 2020 08:42
@francis0407 francis0407 requested review from wshwsh12 and winoros and removed request for a team October 11, 2020 08:42
@github-actions github-actions bot added the sig/execution SIG execution label Oct 11, 2020
@francis0407
Copy link
Member Author

/label sig/planner,/bug-fix

@ti-srebot
Copy link
Contributor

These labels are not found /bug-fix.

@ti-srebot ti-srebot added the sig/planner SIG: Planner label Oct 11, 2020
@francis0407
Copy link
Member Author

/label sig/planner,type/bug-fix

@ti-srebot ti-srebot added the type/bugfix This PR fixes a bug. label Oct 11, 2020
@@ -273,11 +273,24 @@ func (s *testSuite6) TestCreateView(c *C) {
tk.MustExec("create definer='root'@'localhost' view v_nested as select * from test_v_nested")
tk.MustExec("create definer='root'@'localhost' view v_nested2 as select * from v_nested")
_, err = tk.Exec("create or replace definer='root'@'localhost' view v_nested as select * from v_nested2")
c.Assert(terror.ErrorEqual(err, plannercore.ErrNoSuchTable), IsTrue)
c.Assert(terror.ErrorEqual(err, plannercore.ErrViewRecursive), IsTrue)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that this error message is not compatible with MySQL

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -3237,6 +3236,20 @@ func (b *PlanBuilder) buildMemTable(_ context.Context, dbName model.CIStr, table

// BuildDataSourceFromView is used to build LogicalPlan from view
func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model.CIStr, tableInfo *model.TableInfo) (LogicalPlan, error) {
viewFullName := dbName.L + "." + tableInfo.Name.L
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we extract these code block as in individual function like checkRecrusiveView?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed, PTAL

@francis0407
Copy link
Member Author

/run-all-tests

@francis0407
Copy link
Member Author

The test failed due to #20596

@francis0407
Copy link
Member Author

/run-all-tests

@francis0407
Copy link
Member Author

/run-unit-test

Copy link
Contributor

@XuHuaiyu XuHuaiyu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ti-srebot ti-srebot added the status/LGT1 Indicates that a PR has LGTM 1. label Nov 11, 2020
@XuHuaiyu
Copy link
Contributor

PTAL @wshwsh12

Copy link
Contributor

@wshwsh12 wshwsh12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ti-srebot ti-srebot added status/LGT2 Indicates that a PR has LGTM 2. and removed status/LGT1 Indicates that a PR has LGTM 1. labels Nov 12, 2020
@wshwsh12
Copy link
Contributor

/merge

@ti-srebot ti-srebot added the status/can-merge Indicates a PR has been approved by a committer. label Nov 12, 2020
@ti-srebot
Copy link
Contributor

/run-all-tests

@ti-srebot ti-srebot merged commit f81a5d1 into pingcap:master Nov 12, 2020
ti-srebot pushed a commit to ti-srebot/tidb that referenced this pull request Nov 12, 2020
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
@ti-srebot
Copy link
Contributor

cherry pick to release-3.0 in PR #21000

ti-srebot pushed a commit to ti-srebot/tidb that referenced this pull request Nov 12, 2020
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
@ti-srebot
Copy link
Contributor

cherry pick to release-4.0 in PR #21001

ti-srebot added a commit that referenced this pull request Nov 17, 2020
ti-srebot added a commit that referenced this pull request Dec 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
sig/execution SIG execution sig/planner SIG: Planner status/can-merge Indicates a PR has been approved by a committer. status/LGT2 Indicates that a PR has LGTM 2. type/bugfix This PR fixes a bug.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Stack overflow with view recursion
4 participants