!2491 【bugfixed】解决打开enable_cachedplan_mgr后,执行含/*+ choose_adaptive_gplan */的PBE查询报错的问题
Merge pull request !2491 from laishenghao/pbe-subquery
This commit is contained in:
1
src/common/backend/utils/cache/plancache.cpp
vendored
1
src/common/backend/utils/cache/plancache.cpp
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -409,6 +409,7 @@ typedef struct CachedPlanSource {
|
||||
PlanManager *planManager;
|
||||
int gpc_lockid;
|
||||
int nextval_default_expr_type;
|
||||
bool hasSubQuery;
|
||||
} CachedPlanSource;
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user