提交 cbd9a7d7 编写于 作者: C Chris Hajas 提交者: Chris Hajas

Disallow physical index scans in Orca to have predicate condition with subquery

Physical operators should not have subqueries, by this point they should
have been converted into correlated joins or expressions. While we would
consider these invalid plans this wouldn't ever be executed, we assumed
in one case that we could retrieve an exact expression from a group that
contained a subquery when deriving the distribution spec, which caused a
crash.

Now, we'll be more defensive and disallow creating physical index scans
if the predicate contains a subquery. This isn't a problem for generic
gets, as they don't have a scalar predicate.
上级 1a7b4c83
......@@ -66,6 +66,14 @@ CXformDynamicIndexGet2DynamicIndexScan::Transform(CXformContext *pxfctxt,
// create/extract components for alternative
CName *pname = GPOS_NEW(mp) CName(mp, popIndexGet->Name());
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
if (pexprIndexCond->DeriveHasSubquery())
{
return;
}
pexprIndexCond->AddRef();
CTableDescriptor *ptabdesc = popIndexGet->Ptabdesc();
ptabdesc->AddRef();
......@@ -88,10 +96,6 @@ CXformDynamicIndexGet2DynamicIndexScan::Transform(CXformContext *pxfctxt,
COrderSpec *pos = popIndexGet->Pos();
pos->AddRef();
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
pexprIndexCond->AddRef();
// create alternative expression
CExpression *pexprAlt = GPOS_NEW(mp) CExpression(
mp,
......
......@@ -86,6 +86,13 @@ CXformIndexGet2IndexOnlyScan::Transform(CXformContext *pxfctxt,
CIndexDescriptor *pindexdesc = pop->Pindexdesc();
CTableDescriptor *ptabdesc = pop->Ptabdesc();
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
if (pexprIndexCond->DeriveHasSubquery())
{
return;
}
CMDAccessor *md_accessor = COptCtxt::PoctxtFromTLS()->Pmda();
const IMDRelation *pmdrel = md_accessor->RetrieveRel(ptabdesc->MDId());
const IMDIndex *pmdindex = md_accessor->RetrieveIndex(pindexdesc->MDId());
......@@ -127,8 +134,7 @@ CXformIndexGet2IndexOnlyScan::Transform(CXformContext *pxfctxt,
GPOS_ASSERT(NULL != pos);
pos->AddRef();
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
// addref all children
pexprIndexCond->AddRef();
......
......@@ -80,6 +80,13 @@ CXformIndexGet2IndexScan::Transform(CXformContext *pxfctxt,
CIndexDescriptor *pindexdesc = pop->Pindexdesc();
CTableDescriptor *ptabdesc = pop->Ptabdesc();
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
if (pexprIndexCond->DeriveHasSubquery())
{
return;
}
pindexdesc->AddRef();
ptabdesc->AddRef();
......@@ -91,9 +98,6 @@ CXformIndexGet2IndexScan::Transform(CXformContext *pxfctxt,
GPOS_ASSERT(NULL != pos);
pos->AddRef();
// extract components
CExpression *pexprIndexCond = (*pexpr)[0];
// addref all children
pexprIndexCond->AddRef();
......
......@@ -324,6 +324,7 @@ Distinct-LegacyOpfamily;
CSubquery2Test:
Subq2PartialDecorrelate Subq2CorrSQInLOJOn Subq2NotInWhereLOJ Subq2OuterRef2InJoin Subq2OuterRefMultiLevelInOn
Index-Join-With-Subquery-In-Pred
")
set(mdp_dir "../data/dxl/minidump/")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册