Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
MDEV-13068 Crash in Item::split_sum_func2 with INSERT SELECT using wi…
…ndow functions When running setup fields during the final step of insert using select the final setup_fields does not have any sum functions. Our current condition for calling split_sum_func however would attempt to use an empty NULL sum_func_list, if the item contained a window function. The solution is to not perform another split_sum_func for the item containing a window function if we do not actually have a sum_func_list.
- Loading branch information
Showing
3 changed files
with
181 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,97 @@ | ||
| CREATE TABLE t1 (c1 INT, c2 VARCHAR(30)); | ||
| PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'), | ||
| (4, 'manual_insert_2')"; | ||
| INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1; | ||
| INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 4 times [11-14]" FROM t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| 11 should repeat 4 times [11-14] | ||
| 12 should repeat 4 times [11-14] | ||
| 13 should repeat 4 times [11-14] | ||
| 14 should repeat 4 times [11-14] | ||
| 0 should_have_0 | ||
| 2 should_have_2 | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 10 + (dense_rank() over(order by c1)), "dense_rank_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 11 dense_rank_insert | ||
| 12 dense_rank_insert | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 100 + (rank() over(order by c1)), "rank_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| 101 rank_insert | ||
| 102 rank_insert | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 100 + (ntile(10) over(order by c1)), "ntile_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| 101 ntile_insert | ||
| 102 ntile_insert | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 1000 + (percent_rank() over(order by c1)), "percent_rank_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| 1000 percent_rank_insert | ||
| 1001 percent_rank_insert | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 1000 + (count(*) over(order by c1)), "count_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1001 count_insert | ||
| 1002 count_insert | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| # | ||
| # Test how avg interacts when the results need to be rounded. | ||
| # | ||
| SELECT 1000 + (avg(c1) over(order by c1)) as avg_expr, c1, "This will be inserted into t1" from t1; | ||
| avg_expr c1 This will be inserted into t1 | ||
| 1001.0000 1 This will be inserted into t1 | ||
| 1002.5000 4 This will be inserted into t1 | ||
| INSERT INTO t1 | ||
| SELECT 1000 + (avg(c1) over(order by c1)), "avg_insert" from t1; | ||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1001 avg_insert | ||
| 1003 avg_insert | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
| INSERT INTO t1 | ||
| SELECT 1000 + (sum(c1) over(order by c1)), "sum_insert" from t1; | ||
| SELECT c1, c2 | ||
| FROM t1 | ||
| ORDER BY c2, c1; | ||
| c1 c2 | ||
| 1 manual_insert_1 | ||
| 4 manual_insert_2 | ||
| 1001 sum_insert | ||
| 1005 sum_insert | ||
| DROP table t1; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,79 @@ | ||
| CREATE TABLE t1 (c1 INT, c2 VARCHAR(30)); | ||
|
|
||
| PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'), | ||
| (4, 'manual_insert_2')"; | ||
|
|
||
| INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1; | ||
| INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1; | ||
|
|
||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 4 times [11-14]" FROM t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
|
|
||
| INSERT INTO t1 | ||
| SELECT 10 + (dense_rank() over(order by c1)), "dense_rank_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 100 + (rank() over(order by c1)), "rank_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 100 + (ntile(10) over(order by c1)), "ntile_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 1000 + (percent_rank() over(order by c1)), "percent_rank_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 1000 + (count(*) over(order by c1)), "count_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| --echo # | ||
| --echo # Test how avg interacts when the results need to be rounded. | ||
| --echo # | ||
| SELECT 1000 + (avg(c1) over(order by c1)) as avg_expr, c1, "This will be inserted into t1" from t1; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 1000 + (avg(c1) over(order by c1)), "avg_insert" from t1; | ||
|
|
||
| SELECT c1, c2 FROM t1 ORDER BY c2, c1; | ||
|
|
||
| DELETE FROM t1; | ||
| EXECUTE populate_table; | ||
|
|
||
| INSERT INTO t1 | ||
| SELECT 1000 + (sum(c1) over(order by c1)), "sum_insert" from t1; | ||
|
|
||
| SELECT c1, c2 | ||
| FROM t1 | ||
| ORDER BY c2, c1; | ||
|
|
||
| DROP table t1; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters