!2491 【bugfixed】解决打开enable_cachedplan_mgr后,执行含/*+ choose_adaptive_gplan */的PBE查询报错的问题

Merge pull request !2491 from laishenghao/pbe-subquery
This commit is contained in:
opengauss-bot
2022-11-26 09:59:53 +00:00
committed by Gitee
5 changed files with 111 additions and 1 deletions

View File

@ -288,6 +288,7 @@ CachedPlanSource* CreateCachedPlan(Node* raw_parse_tree, const char* query_strin
plansource->sql_patch_sequence = pg_atomic_read_u64(&g_instance.cost_cxt.sql_patch_sequence_id);
plansource->planManager = NULL;
plansource->gpc_lockid = -1;
plansource->hasSubQuery = false;
#ifdef ENABLE_MOT

View File

@ -143,7 +143,7 @@ ChooseAdaptivePlan(CachedPlanSource *plansource, ParamListInfo boundParams)
return false;
}
if(!selec_gplan_by_hint(plansource)){
if(plansource->hasSubQuery || !selec_gplan_by_hint(plansource)){
PMGR_ReleasePlanManager(plansource);
return false;
}
@ -474,6 +474,7 @@ InsertPlan(CachedPlanSource *plansource,
} else {
plan->refcount++;
}
plan->is_saved = true;
plan->cpi = cpinfo;
(void)MemoryContextSwitchTo(planMgr->context);
@ -658,6 +659,25 @@ FindMatchedPlan(PlanManager *manager, PlannerInfo *queryRoot)
return NULL;
}
bool ContainSubQuery(PlannerInfo* root)
{
if (root->glob->subroots != NIL) {
return true;
}
/* 0 for other purpose, so start from 1 */
for (int i = 1; i < root->simple_rel_array_size; ++i) {
RelOptInfo* rel = root->simple_rel_array[i];
if (!rel) {
continue;
}
if (rel->rtekind == RTE_SUBQUERY) {
return true;
}
}
return false;
}
void
CacheGenericRoot(CachedPlanSource *plansource, char *psrc_key)
{
@ -868,6 +888,11 @@ ActionHandle(CachedPlanSource *plansource,
/* acquire an exclusive lock to update plan manager. */
ManagerLockSwitchTo(action, LW_EXCLUSIVE);
if (ContainSubQuery((PlannerInfo*)u_sess->pcache_cxt.explored_plan_info)) {
manager->is_valid = false;
plansource->hasSubQuery = true;
}
/*
* A valid save_xmin (!= 0) imples that the plan is temporary. To prevent
* the high cost of plan revaildation, we do not cache such plan to avoid

View File

@ -409,6 +409,7 @@ typedef struct CachedPlanSource {
PlanManager *planManager;
int gpc_lockid;
int nextval_default_expr_type;
bool hasSubQuery;
} CachedPlanSource;
/*

View File

@ -4196,3 +4196,56 @@ select * from bs_his order by period_name;
drop FUNCTION test_func;
drop table bs_his;
drop table cs_his;
-- pbe choose_adaptive_gplan
create table tab_1103983(c1 int,c2 varchar,c3 text) ;
insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(1, 100));
insert into tab_1103983 values(generate_series(1, 50),generate_series(2, 30),generate_series(2, 30));
insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 50),generate_series(2, 30));
insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 30),generate_series(1, 50));
insert into tab_1103983 values(generate_series(1, 100),null,null);
insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(2, 100));
create index on tab_1103983(c2,c3);
analyze tab_1103983;
prepare pbe_cagp as select /*+ choose_adaptive_gplan */ t1.c1,max(t2.c3) from tab_1103983 t1
join (select /*+ choose_adaptive_gplan */ * from tab_1103983 where c1=$1 and c2 = $2) t2
on t1.c1 = t2.c1
where t2.c2 = (select max(c2) from tab_1103983 where c2 = $1 )
and t1.c3 = $2
group by 1
order by 1,2;
execute pbe_cagp(1,1);
c1 | max
----+-----
1 | 99
(1 row)
execute pbe_cagp(3,3);
c1 | max
----+-----
3 | 99
(1 row)
execute pbe_cagp(4,4);
c1 | max
----+-----
4 | 99
(1 row)
execute pbe_cagp(5,1);
c1 | max
----+-----
(0 rows)
execute pbe_cagp(7,8);
c1 | max
----+-----
(0 rows)
execute pbe_cagp(10,10);
c1 | max
----+-----
10 | 99
(1 row)
deallocate pbe_cagp;
drop table tab_1103983;

View File

@ -820,3 +820,33 @@ select * from bs_his order by period_name;
drop FUNCTION test_func;
drop table bs_his;
drop table cs_his;
-- pbe choose_adaptive_gplan
create table tab_1103983(c1 int,c2 varchar,c3 text) ;
insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(1, 100));
insert into tab_1103983 values(generate_series(1, 50),generate_series(2, 30),generate_series(2, 30));
insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 50),generate_series(2, 30));
insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 30),generate_series(1, 50));
insert into tab_1103983 values(generate_series(1, 100),null,null);
insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(2, 100));
create index on tab_1103983(c2,c3);
analyze tab_1103983;
prepare pbe_cagp as select /*+ choose_adaptive_gplan */ t1.c1,max(t2.c3) from tab_1103983 t1
join (select /*+ choose_adaptive_gplan */ * from tab_1103983 where c1=$1 and c2 = $2) t2
on t1.c1 = t2.c1
where t2.c2 = (select max(c2) from tab_1103983 where c2 = $1 )
and t1.c3 = $2
group by 1
order by 1,2;
execute pbe_cagp(1,1);
execute pbe_cagp(3,3);
execute pbe_cagp(4,4);
execute pbe_cagp(5,1);
execute pbe_cagp(7,8);
execute pbe_cagp(10,10);
deallocate pbe_cagp;
drop table tab_1103983;