fix percent rounding behavior

This commit is contained in:
Ziming Zhang
2024-10-31 22:58:22 +08:00
parent 1537dbf0c0
commit 0531ade8c5
3 changed files with 62 additions and 17 deletions

View File

@ -147,7 +147,7 @@ static TupleTableSlot* ExecLimit(PlanState* state) /* return: a tuple or NULL */
tuple_num++;
}
node->count = (int64)(node->fraction * tuple_num);
node->count = std::ceil(node->fraction * tuple_num);
if (node->count <= 0) {
node->lstate = LIMIT_EMPTY;
return NULL;

View File

@ -2,6 +2,27 @@ CREATE DATABASE frwt_db;
\c frwt_db
-- With Ties功能测试
-- 数据库初始化:创建测试表并插入数据
create table t(X char,Y number,Z NUMBER);
insert into t values('A',1,NULL);
insert into t values('B',2,1);
insert into t values('C',3,1);
insert into t values('D',4,2);
insert into t values('E',5,3);
insert into t values('F',6,47);
SELECT * FROM T FETCH FIRST 20 PERCENT ROW ONLY;
x | y | z
---+---+---
A | 1 |
B | 2 | 1
(2 rows)
SELECT * FROM T FETCH NEXT 20 PERCENT ROW WITH TIES;
x | y | z
---+---+---
A | 1 |
B | 2 | 1
(2 rows)
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
@ -100,7 +121,8 @@ SELECT * FROM test_table ORDER BY score DESC FETCH FIRST 0 ROWS WITH TIES;
SELECT * FROM test_table ORDER BY score FETCH NEXT 3 PERCENT ROWS WITH TIES;
id | name | score | group_id
----+------+-------+----------
(0 rows)
10 | Judy | 60 | 5
(1 row)
-- 测试用例 5: 复杂查询
-- 5.1 联合查询中的 WITH TIES
@ -292,13 +314,13 @@ SELECT COUNT(*) FROM emp_view_ties;
SELECT COUNT(*) FROM emp_view_percent;
count
-------
3
4
(1 row)
SELECT COUNT(*) FROM emp_view_percent_ties;
count
-------
4
5
(1 row)
INSERT INTO employees (id, name, department, salary) VALUES (10, 'Eve', 'Finance', 6200);
@ -345,7 +367,7 @@ BEGIN
RAISE NOTICE 'Total: %', rec.count;
END LOOP;
END $$;
NOTICE: Total: 4
NOTICE: Total: 5
-- 测试用例 9: SMP支持
SET query_dop=1002;
DELETE FROM test_table;
@ -434,7 +456,8 @@ SELECT * FROM percent_test_table ORDER BY score DESC OFFSET 5 FETCH NEXT 30 PERC
8 | Heidi | 60 | 4
9 | Ivan | 55 | 5
10 | Judy | 50 | 5
(5 rows)
11 | Ken | 45 | 6
(6 rows)
-- 用例 4: 使用不同百分比值的测试
-- 获取 10% 的行
@ -442,7 +465,8 @@ SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 10 PERCENT ROWS
id | name | score | group_id
----+-------+-------+----------
1 | Alice | 95 | 1
(1 row)
2 | Bob | 90 | 1
(2 rows)
-- 获取 75% 的行
SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 75 PERCENT ROWS ONLY;
@ -461,7 +485,8 @@ SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 75 PERCENT ROWS
11 | Ken | 45 | 6
12 | Laura | 40 | 6
13 | Mike | 35 | 7
(13 rows)
14 | Nancy | 30 | 7
(14 rows)
-- 用例 5: 超过 100% 的百分比测试
SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 110 PERCENT ROWS ONLY;
@ -521,7 +546,8 @@ SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 50.5 PERCENT ROW
7 | Grace | 65 | 4
8 | Heidi | 60 | 4
9 | Ivan | 55 | 5
(9 rows)
10 | Judy | 50 | 5
(10 rows)
SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 50.5 PERCENT ROWS WITH TIES;
id | name | score | group_id
@ -535,7 +561,8 @@ SELECT * FROM percent_test_table ORDER BY score DESC FETCH NEXT 50.5 PERCENT ROW
7 | Grace | 65 | 4
8 | Heidi | 60 | 4
9 | Ivan | 55 | 5
(9 rows)
10 | Judy | 50 | 5
(10 rows)
-- 用例 9: 空数据集测试
CREATE TABLE empty_table (
@ -568,7 +595,8 @@ SELECT * FROM percent_test_table ORDER BY group_id ASC, score DESC FETCH NEXT 30
3 | Charlie | 85 | 2
4 | David | 80 | 2
5 | Eve | 75 | 3
(5 rows)
6 | Frank | 70 | 3
(6 rows)
-- 用例 11: 含有 NULL 值的数据处理
-- 插入包含 NULL 的数据
@ -638,7 +666,8 @@ SELECT * FROM percent_partitioned_table FETCH FIRST 50 PERCENT ROWS ONLY;
| Peter | 70 | 3
| Grace | 65 | 4
| Heidi | 60 | 4
(9 rows)
| Ivan | 55 | 5
(10 rows)
-- 分区表用例 2: FETCH NEXT N PERCENT 与 ORDER BY 结合
SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 50 PERCENT ROWS ONLY;
@ -653,7 +682,8 @@ SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 50 PERCE
| Peter | 70 | 3
| Grace | 65 | 4
| Heidi | 60 | 4
(9 rows)
| Ivan | 55 | 5
(10 rows)
-- 分区表用例 3: FETCH NEXT N PERCENT 与 OFFSET 结合
SELECT * FROM percent_partitioned_table ORDER BY score DESC OFFSET 5 ROWS FETCH NEXT 30 PERCENT ROWS ONLY;
@ -664,7 +694,8 @@ SELECT * FROM percent_partitioned_table ORDER BY score DESC OFFSET 5 ROWS FETCH
| Grace | 65 | 4
| Heidi | 60 | 4
| Ivan | 55 | 5
(5 rows)
| Judy | 50 | 5
(6 rows)
-- 分区表用例 4: 使用不同百分比值的测试
-- 获取 10% 的行
@ -672,7 +703,8 @@ SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 10 PERCE
id | name | score | group_id
----+-------+-------+----------
| Alice | 95 | 1
(1 row)
| Bob | 90 | 1
(2 rows)
-- 获取 75% 的行
SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 75 PERCENT ROWS ONLY;
@ -692,7 +724,8 @@ SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 75 PERCE
| Ken | 45 | 6
| Laura | 40 | 6
| Mike | 35 | 7
(14 rows)
| Nancy | 30 | 7
(15 rows)
-- 分区表用例 5: 超过 100% 的百分比测试
SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 110 PERCENT ROWS ONLY;
@ -732,7 +765,8 @@ SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 50 PERCE
| Peter | 70 | 3
| Grace | 65 | 4
| Heidi | 60 | 4
(9 rows)
| Ivan | 55 | 5
(10 rows)
-- 分区表用例 7: FETCH NEXT 0 PERCENT
SELECT * FROM percent_partitioned_table ORDER BY score DESC FETCH FIRST 0 PERCENT ROWS ONLY;

View File

@ -3,6 +3,17 @@ CREATE DATABASE frwt_db;
-- With Ties功能测试
-- 数据库初始化:创建测试表并插入数据
create table t(X char,Y number,Z NUMBER);
insert into t values('A',1,NULL);
insert into t values('B',2,1);
insert into t values('C',3,1);
insert into t values('D',4,2);
insert into t values('E',5,3);
insert into t values('F',6,47);
SELECT * FROM T FETCH FIRST 20 PERCENT ROW ONLY;
SELECT * FROM T FETCH NEXT 20 PERCENT ROW WITH TIES;
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),