!2084 修复带有agg的查询在计划化简时目标列类型处理问题

Merge pull request !2084 from cc_db_dev/agg_false_target
This commit is contained in:
opengauss-bot
2022-09-24 06:47:40 +00:00
committed by Gitee
3 changed files with 195 additions and 3 deletions

View File

@ -3105,7 +3105,7 @@ static Plan* grouping_planner(PlannerInfo* root, double tuple_fraction)
* happen, because AggRef not in agg node.
*/
if (lc2 != NULL) {
tle->expr = (Expr*)makeNullConst(exprType(node), exprTypmod(node), exprCollation(node));
tle->expr = (Expr*)makeNullConst(exprType((Node*)tle->expr), exprTypmod((Node*)tle->expr), exprCollation((Node*)tle->expr));
}
list_free_ext(exprList);
}

View File

@ -20,5 +20,135 @@ select a , count(distinct generate_series(1,2)) from t1 group by a;
Output: a
(8 rows)
--test const-false agg
CREATE TABLE bmsql_item (
i_id int4 NoT NULL,i_name varchar(24),i_price numeric(5,2),i_data varchar( 50),i_im_id int4,
coNSTRAINT bmsql_item_pkey PRIMARY KEY (i_id)
);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "bmsql_item_pkey" for table "bmsql_item"
insert into bmsql_item values ('1','sqltest_varchar_1','0.01','sqltest_varchar_1','1');
insert into bmsql_item values ('2','sqltest_varchar_2','0.02','sqltest_varchar_2','2');
insert into bmsql_item values ('3','sqltest_varchar_3','0.03','sqltest_varchar_3','3');
insert into bmsql_item values ('4','sqltest_varchar_4','0.04','sqltest_varchar_4','4');
insert into bmsql_item values ('5');
CREATE TABLE bmsql_new_order (
no_w_id int4 NOT NULL,
no_d_id int4 NOT NULL,no_o_id int4 NOT NULL
);
insert into bmsql_new_order values('1','1','1');
insert into bmsql_new_order values('2','2','2');
insert into bmsql_new_order values('3','3','3');
insert into bmsql_new_order values('4','4','4');
insert into bmsql_new_order values('5','5','5');
SELECT
(avg(alias24.alias17)>2) AS alias32
FROM
bmsql_item,
(
SELECT alias12.alias5 AS alias17
FROM ( SELECT sin(bmsql_new_order.no_o_id)alias5 FROM bmsql_new_order )alias12
)alias24
GROUP BY bmsql_item.i_im_id HAVING 1>2
UNION
SELECT TRUE FROM bmsql_item;
alias32
---------
t
(1 row)
explain (verbose,costs off)
SELECT
(avg(alias24.alias17)>2) AS alias32
FROM
bmsql_item,
(
SELECT alias12.alias5 AS alias17
FROM ( SELECT sin(bmsql_new_order.no_o_id)alias5 FROM bmsql_new_order )alias12
)alias24
GROUP BY bmsql_item.i_im_id HAVING 1>2
UNION
SELECT TRUE FROM bmsql_item;
QUERY PLAN
-------------------------------------------------------------------------------
Unique
Output: (NULL::boolean)
-> Sort
Output: (NULL::boolean)
Sort Key: (NULL::boolean)
-> Append
-> Subquery Scan on "*SELECT* 1"
Output: NULL::boolean
-> Result
Output: NULL::boolean, aggregate.bmsql_item.i_im_id
One-Time Filter: false
-> Seq Scan on aggregate.bmsql_item
Output: true
(13 rows)
create table test_agg_false(a int, b varchar(20),c text, d numeric(5,2));
explain (verbose ,costs off) select sum(a),sum(b) , d from test_agg_false where 0=1 group by d;
QUERY PLAN
--------------------------------------------
Result
Output: NULL::bigint, NULL::numeric, d
One-Time Filter: false
-> Seq Scan on aggregate.test_agg_false
Output: a, b, c, d
(5 rows)
select sum(a),sum(b) , d from test_agg_false where 0=1 group by d;
sum | sum | d
-----+-----+---
(0 rows)
explain (verbose, costs off) select sum(a)+sum(b) , d from test_agg_false where 0=1 group by d;
QUERY PLAN
--------------------------------------------
Result
Output: NULL::numeric, d
One-Time Filter: false
-> Seq Scan on aggregate.test_agg_false
Output: a, b, c, d
(5 rows)
select sum(a)+sum(b) , d from test_agg_false where 0=1 group by d;
?column? | d
----------+---
(0 rows)
explain (verbose, costs off) select sin(sum(a)+sum(b)) , d from test_agg_false where 0=1 group by d;
QUERY PLAN
--------------------------------------------
Result
Output: NULL::double precision, d
One-Time Filter: false
-> Seq Scan on aggregate.test_agg_false
Output: a, b, c, d
(5 rows)
select sin(sum(a)+sum(b)) , d from test_agg_false where 0=1 group by d;
sin | d
-----+---
(0 rows)
explain (verbose ,costs off) select sum(a)+sum(b) , d , 1 from test_agg_false where 0=1 group by d;
QUERY PLAN
--------------------------------------------
Result
Output: NULL::numeric, d, 1
One-Time Filter: false
-> Seq Scan on aggregate.test_agg_false
Output: a, b, c, d
(5 rows)
select sum(a)+sum(b) , d ,1 from test_agg_false where 0=1 group by d;
?column? | d | ?column?
----------+---+----------
(0 rows)
drop table t1;
drop schema aggregate;
drop schema aggregate CASCADE;
NOTICE: drop cascades to 3 other objects
DETAIL: drop cascades to table bmsql_item
drop cascades to table bmsql_new_order
drop cascades to table test_agg_false

View File

@ -9,5 +9,67 @@ select a , count(distinct generate_series(1,2)) from t1 group by a;
explain (verbose, costs off)
select a , count(distinct generate_series(1,2)) from t1 group by a;
--test const-false agg
CREATE TABLE bmsql_item (
i_id int4 NoT NULL,i_name varchar(24),i_price numeric(5,2),i_data varchar( 50),i_im_id int4,
coNSTRAINT bmsql_item_pkey PRIMARY KEY (i_id)
);
insert into bmsql_item values ('1','sqltest_varchar_1','0.01','sqltest_varchar_1','1');
insert into bmsql_item values ('2','sqltest_varchar_2','0.02','sqltest_varchar_2','2');
insert into bmsql_item values ('3','sqltest_varchar_3','0.03','sqltest_varchar_3','3');
insert into bmsql_item values ('4','sqltest_varchar_4','0.04','sqltest_varchar_4','4');
insert into bmsql_item values ('5');
CREATE TABLE bmsql_new_order (
no_w_id int4 NOT NULL,
no_d_id int4 NOT NULL,no_o_id int4 NOT NULL
);
insert into bmsql_new_order values('1','1','1');
insert into bmsql_new_order values('2','2','2');
insert into bmsql_new_order values('3','3','3');
insert into bmsql_new_order values('4','4','4');
insert into bmsql_new_order values('5','5','5');
SELECT
(avg(alias24.alias17)>2) AS alias32
FROM
bmsql_item,
(
SELECT alias12.alias5 AS alias17
FROM ( SELECT sin(bmsql_new_order.no_o_id)alias5 FROM bmsql_new_order )alias12
)alias24
GROUP BY bmsql_item.i_im_id HAVING 1>2
UNION
SELECT TRUE FROM bmsql_item;
explain (verbose,costs off)
SELECT
(avg(alias24.alias17)>2) AS alias32
FROM
bmsql_item,
(
SELECT alias12.alias5 AS alias17
FROM ( SELECT sin(bmsql_new_order.no_o_id)alias5 FROM bmsql_new_order )alias12
)alias24
GROUP BY bmsql_item.i_im_id HAVING 1>2
UNION
SELECT TRUE FROM bmsql_item;
create table test_agg_false(a int, b varchar(20),c text, d numeric(5,2));
explain (verbose ,costs off) select sum(a),sum(b) , d from test_agg_false where 0=1 group by d;
select sum(a),sum(b) , d from test_agg_false where 0=1 group by d;
explain (verbose, costs off) select sum(a)+sum(b) , d from test_agg_false where 0=1 group by d;
select sum(a)+sum(b) , d from test_agg_false where 0=1 group by d;
explain (verbose, costs off) select sin(sum(a)+sum(b)) , d from test_agg_false where 0=1 group by d;
select sin(sum(a)+sum(b)) , d from test_agg_false where 0=1 group by d;
explain (verbose ,costs off) select sum(a)+sum(b) , d , 1 from test_agg_false where 0=1 group by d;
select sum(a)+sum(b) , d ,1 from test_agg_false where 0=1 group by d;
drop table t1;
drop schema aggregate;
drop schema aggregate CASCADE;