greenplumn CLogicalMaxOneRow 源码
greenplumn CLogicalMaxOneRow 代码
文件路径:/src/backend/gporca/libgpopt/src/operators/CLogicalMaxOneRow.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2014 VMware, Inc. or its affiliates..
//
// @filename:
// CLogicalMaxOneRow.cpp
//
// @doc:
// Implementation of logical MaxOneRow operator
//---------------------------------------------------------------------------
#include "gpopt/operators/CLogicalMaxOneRow.h"
#include "gpos/base.h"
#include "gpopt/operators/CExpression.h"
#include "gpopt/operators/CExpressionHandle.h"
#include "gpopt/xforms/CXformUtils.h"
using namespace gpopt;
//---------------------------------------------------------------------------
// @function:
// CLogicalMaxOneRow::Esp
//
// @doc:
// Promise level for stat derivation
//
//---------------------------------------------------------------------------
CLogical::EStatPromise
CLogicalMaxOneRow::Esp(CExpressionHandle &exprhdl) const
{
// low promise for stat derivation if logical expression has outer-refs
// or is part of an Apply expression
if (exprhdl.HasOuterRefs() ||
(nullptr != exprhdl.Pgexpr() &&
CXformUtils::FGenerateApply(exprhdl.Pgexpr()->ExfidOrigin())))
{
return EspLow;
}
return EspHigh;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalMaxOneRow::PcrsStat
//
// @doc:
// Promise level for stat derivation
//
//---------------------------------------------------------------------------
CColRefSet *
CLogicalMaxOneRow::PcrsStat(CMemoryPool *mp, CExpressionHandle &exprhdl,
CColRefSet *pcrsInput, ULONG child_index) const
{
GPOS_ASSERT(0 == child_index);
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp);
pcrs->Union(pcrsInput);
// intersect with the output columns of relational child
pcrs->Intersection(exprhdl.DeriveOutputColumns(child_index));
return pcrs;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalMaxOneRow::PxfsCandidates
//
// @doc:
// Compute candidate xforms
//
//---------------------------------------------------------------------------
CXformSet *
CLogicalMaxOneRow::PxfsCandidates(CMemoryPool *mp) const
{
CXformSet *xform_set = GPOS_NEW(mp) CXformSet(mp);
(void) xform_set->ExchangeSet(CXform::ExfMaxOneRow2Assert);
return xform_set;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalMaxOneRow::PstatsDerive
//
// @doc:
// Derive statistics
//
//---------------------------------------------------------------------------
IStatistics *
CLogicalMaxOneRow::PstatsDerive(CMemoryPool *mp, CExpressionHandle &exprhdl,
IStatisticsArray * // stats_ctxt
) const
{
// no more than one row can be produced by operator, scale down input statistics accordingly
IStatistics *stats = exprhdl.Pstats(0);
return stats->ScaleStats(mp, CDouble(1.0 / stats->Rows()));
}
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦