未验证 提交 a8eb84a2 编写于 作者: C Chris Hajas 提交者: GitHub

Fix Orca CTAS for tables created with legacy vs non-legacy hashops (#10833)

For CTAS creating tables with non-legacy hashop distribution from tables
with legacy hashops, CTAS with Orca would distribute the data according
to the value of gp_use_legacy_hashops; however, it would set the table's
distribution policy hashop to the value of the original table. This
caused queries to give incorrect results as the distribution policy
mismatched the data distribution.

The data was being distributed correctly as we used the correct opfamily
internally in Orca when determining the distribution spec. However, when
populating the distribution policy value in the table in
CTranslatorDXLToPlStmt.cpp, we were trying to derive the opclass from
the opfamily. This doesn't work, and instead we need to pass the opclass
from the query through Orca and to the plan statement. Hence we use the
opfamily internally within Orca, and simply pass through the opclass to
populate the gp_distribution_policy value correctly.

Additionally, CTAS minidumps have been failing for quite a while, and
subsequent changes made this a bit difficult to untangle. Since we only
have ~10 mdp files, I simply regenerated most of these files and made
the opfamily/opclasses arrays required as part of CMDRelationCTAS,
LogicalCTAS, and PhysicalCTAS.

Also, remove the `GPOS_ASSERT(NULL == mdhtacc.Find());` assert in
CMDAccessor.cpp. We've been hitting this with newly created mdps since
at least a couple of years, but haven't added new CTAS mdps since then.
Removing the assert doesn't seem to cause any problems and it's only
relevant for mdps.
上级 8d4ac26a
......@@ -5455,18 +5455,15 @@ CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToDistrPolicy(
{
GPOS_ASSERT(0 < num_of_distr_cols);
distr_policy->nattrs = num_of_distr_cols;
IMdIdArray *opclasses = dxlop->GetDistrOpclasses();
GPOS_ASSERT(opclasses->Size() == num_of_distr_cols);
for (ULONG ul = 0; ul < num_of_distr_cols; ul++)
{
ULONG col_pos_idx = *((*distr_col_pos_array)[ul]);
TargetEntry *tle =
(TargetEntry *) gpdb::ListNth(target_list, col_pos_idx);
Oid typeoid = gpdb::ExprType((Node *) tle->expr);
distr_policy->attrs[ul] = col_pos_idx + 1;
distr_policy->opclasses[ul] =
m_dxl_to_plstmt_context->GetDistributionHashOpclassForType(
typeoid);
Oid opclass = CMDIdGPDB::CastMdid((*opclasses)[ul])->Oid();
distr_policy->opclasses[ul] = opclass;
}
}
return distr_policy;
......
......@@ -897,7 +897,9 @@ CTranslatorQueryToDXL::TranslateCTASToDXL()
IMDRelation::Ereldistrpolicy rel_distr_policy =
IMDRelation::EreldistrRandom;
ULongPtrArray *distribution_colids = NULL;
IMdIdArray *distr_opfamilies = NULL;
IMdIdArray *distr_opfamilies = GPOS_NEW(m_mp) IMdIdArray(m_mp);
IMdIdArray *distr_opclasses = GPOS_NEW(m_mp) IMdIdArray(m_mp);
if (NULL != m_query->intoPolicy)
{
......@@ -907,7 +909,6 @@ CTranslatorQueryToDXL::TranslateCTASToDXL()
if (IMDRelation::EreldistrHash == rel_distr_policy)
{
distribution_colids = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
distr_opfamilies = GPOS_NEW(m_mp) IMdIdArray(m_mp);
for (ULONG ul = 0; ul < (ULONG) m_query->intoPolicy->nattrs; ul++)
{
......@@ -918,7 +919,13 @@ CTranslatorQueryToDXL::TranslateCTASToDXL()
Oid opfamily =
gpdb::GetOpclassFamily(m_query->intoPolicy->opclasses[ul]);
GPOS_ASSERT(InvalidOid != opfamily);
// We use the opfamily to populate the
// distribution spec within ORCA, but also need
// the opclass to populate the distribution
// policy of the created table in the catalog
distr_opfamilies->Append(GPOS_NEW(m_mp) CMDIdGPDB(opfamily));
distr_opclasses->Append(GPOS_NEW(m_mp) CMDIdGPDB(
m_query->intoPolicy->opclasses[ul]));
}
}
}
......@@ -969,8 +976,9 @@ CTranslatorQueryToDXL::TranslateCTASToDXL()
m_mp, mdid, md_schema_name, md_relname, dxl_col_descr_array,
GPOS_NEW(m_mp) CDXLCtasStorageOptions(
md_tablespace_name, ctas_commit_action, ctas_storage_options),
rel_distr_policy, distribution_colids, distr_opfamilies, fTempTable,
has_oids, rel_storage_type, source_array, var_typmods);
rel_distr_policy, distribution_colids, distr_opfamilies,
distr_opclasses, fTempTable, has_oids, rel_storage_type, source_array,
var_typmods);
return GPOS_NEW(m_mp) CDXLNode(m_mp, ctas_dxlop, query_dxlnode);
}
......
<?xml version="1.0" encoding="UTF-8"?>
<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/">
<dxl:Comment><![CDATA[
Basic test for a simple CTAS that requires redistribution.
create table foo (a int, b int) distributed by (a);
explain create table bar as select * from foo distributed randomly;
]]>
</dxl:Comment>
<dxl:Thread Id="0">
<dxl:OptimizerConfig>
<dxl:EnumeratorConfig Id="0" PlanSamples="0" CostThreshold="0"/>
<dxl:StatisticsConfig DampingFactorFilter="0.750000" DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" MaxStatsBuckets="100"/>
<dxl:CTEConfig CTEInliningCutoff="0"/>
<dxl:WindowOids RowNumber="7000" Rank="7001"/>
<dxl:TraceFlags Value="103027,101013,102024,102025,102115,102117,103001"/>
<dxl:CTEConfig CTEInliningCutoff="0"/>
<dxl:WindowOids RowNumber="3100" Rank="3101"/>
<dxl:CostModelConfig CostModelType="1" SegmentsForCosting="3">
<dxl:CostParams>
<dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/>
</dxl:CostParams>
</dxl:CostModelConfig>
<dxl:Hint MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10"/>
<dxl:TraceFlags Value="102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
</dxl:OptimizerConfig>
<dxl:Metadata SystemIds="0.GPDB">
<dxl:ColumnStatistics Mdid="1.586154.1.1.5" Name="xmax" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.4" Name="cmin" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:Metadata SystemIds="0.CTAS,0.GPDB">
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2222.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/>
<dxl:EqualityOp Mdid="0.91.1.0"/>
<dxl:InequalityOp Mdid="0.85.1.0"/>
<dxl:LessThanOp Mdid="0.58.1.0"/>
......@@ -26,7 +39,9 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7100.1.0"/>
<dxl:EqualityOp Mdid="0.96.1.0"/>
<dxl:InequalityOp Mdid="0.518.1.0"/>
<dxl:LessThanOp Mdid="0.97.1.0"/>
......@@ -41,7 +56,9 @@
<dxl:SumAgg Mdid="0.2108.1.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.1990.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7109.1.0"/>
<dxl:EqualityOp Mdid="0.607.1.0"/>
<dxl:InequalityOp Mdid="0.608.1.0"/>
<dxl:LessThanOp Mdid="0.609.1.0"/>
......@@ -56,7 +73,9 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.27.1.0" Name="tid" IsRedistributable="true" IsHashable="false" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="6" PassByValue="false">
<dxl:Type Mdid="0.27.1.0" Name="tid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="6" PassByValue="false">
<dxl:DistrOpfamily Mdid="0.7077.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7110.1.0"/>
<dxl:EqualityOp Mdid="0.387.1.0"/>
<dxl:InequalityOp Mdid="0.402.1.0"/>
<dxl:LessThanOp Mdid="0.2799.1.0"/>
......@@ -71,7 +90,8 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.29.1.0" Name="cid" IsRedistributable="false" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.29.1.0" Name="cid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2226.1.0"/>
<dxl:EqualityOp Mdid="0.385.1.0"/>
<dxl:InequalityOp Mdid="0.0.0.0"/>
<dxl:LessThanOp Mdid="0.0.0.0"/>
......@@ -86,9 +106,10 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="false" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2225.1.0"/>
<dxl:EqualityOp Mdid="0.352.1.0"/>
<dxl:InequalityOp Mdid="0.0.0.0"/>
<dxl:InequalityOp Mdid="0.3315.1.0"/>
<dxl:LessThanOp Mdid="0.0.0.0"/>
<dxl:LessThanEqualsOp Mdid="0.0.0.0"/>
<dxl:GreaterThanOp Mdid="0.0.0.0"/>
......@@ -101,23 +122,8 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:CTASRelation Mdid="5.1.1.0" Name="r" IsTemporary="false" HasOids="false" StorageType="Heap" VarTypeModList="-1" DistributionPolicy="Random">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.29.1.0" Nullable="true" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
</dxl:CTASRelation>
<dxl:ColumnStatistics Mdid="1.586154.1.1.7" Name="tableoid" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.6" Name="cmax" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.8" Name="gp_segment_id" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.1" Name="b" Width="8.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.0" Name="a" Width="8.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.3" Name="xmin" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:ColumnStatistics Mdid="1.586154.1.1.2" Name="ctid" Width="6.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000"/>
<dxl:RelationStatistics Mdid="2.586154.1.1" Name="s" Rows="0.000000" EmptyRelation="true"/>
<dxl:Relation Mdid="0.586154.1.1" Name="s" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Hash" DistributionColumns="0" Keys="8,2">
<dxl:RelationStatistics Mdid="2.57379.1.0" Name="foo" Rows="0.000000" EmptyRelation="true"/>
<dxl:Relation Mdid="0.57379.1.0" Name="foo" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Hash" DistributionColumns="0" Keys="8,2" NumberLeafPartitions="0">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4">
<dxl:DefaultValue/>
......@@ -150,56 +156,85 @@
<dxl:IndexInfoList/>
<dxl:Triggers/>
<dxl:CheckConstraints/>
<dxl:DistrOpfamilies>
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
</dxl:DistrOpfamilies>
</dxl:Relation>
<dxl:CTASRelation Mdid="5.1.1.0" Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" VarTypeModList="-1,-1" DistributionPolicy="Random">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="b" Attno="2" Mdid="0.23.1.0" Nullable="true">
<dxl:DefaultValue/>
</dxl:Column>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
</dxl:CTASRelation>
<dxl:ColumnStatistics Mdid="1.57379.1.0.0" Name="a" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
</dxl:Metadata>
<dxl:Query>
<dxl:OutputColumns>
<dxl:Ident ColId="5" ColName="a" TypeMdid="0.29.1.0"/>
<dxl:Ident ColId="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="2" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:OutputColumns>
<dxl:CTEList/>
<dxl:LogicalCTAS Mdid="5.1.1.0" Name="r" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="5" VarTypeModList="-1">
<dxl:LogicalCTAS Mdid="5.1.1.0" Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="1,2" VarTypeModList="-1,-1">
<dxl:Columns>
<dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
<dxl:LogicalGet>
<dxl:TableDescriptor Mdid="0.586154.1.1" TableName="s">
<dxl:TableDescriptor Mdid="0.57379.1.0" TableName="foo">
<dxl:Columns>
<dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="2" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
<dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="2" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
<dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
</dxl:LogicalGet>
</dxl:LogicalCTAS>
</dxl:Query>
<dxl:Plan Id="0" SpaceSize="1">
<dxl:PhysicalCTAS Name="r" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="4" VarTypeModList="-1">
<dxl:PhysicalCTAS Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="0,1" VarTypeModList="-1,-1">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="3.027344" Rows="1.000000" Width="4"/>
<dxl:Cost StartupCost="0" TotalCost="431.015649" Rows="1.000000" Width="8"/>
</dxl:Properties>
<dxl:DistrOpclasses/>
<dxl:Columns>
<dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:ProjList>
<dxl:ProjElem ColId="4" Alias="a">
<dxl:Ident ColId="4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:ProjElem ColId="0" Alias="a">
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
<dxl:ProjElem ColId="1" Alias="b">
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="2.011719" Rows="1.000000" Width="8"/>
<dxl:Cost StartupCost="0" TotalCost="431.000024" Rows="1.000000" Width="12"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="4" Alias="cmin">
<dxl:Ident ColId="4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:ProjElem ColId="0" Alias="a">
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
<dxl:ProjElem ColId="1" Alias="b">
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
<dxl:ProjElem ColId="9" Alias="ColRef_0009">
<dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
......@@ -207,37 +242,44 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
<dxl:RandomMotion InputSegments="0,1" OutputSegments="0,1">
<dxl:RandomMotion InputSegments="0,1,2" OutputSegments="0,1,2">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="1.003906" Rows="1.000000" Width="4"/>
<dxl:Cost StartupCost="0" TotalCost="431.000020" Rows="1.000000" Width="8"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="4" Alias="cmin">
<dxl:Ident ColId="4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:ProjElem ColId="0" Alias="a">
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
<dxl:ProjElem ColId="1" Alias="b">
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
<dxl:TableScan>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.001953" Rows="1.000000" Width="4"/>
<dxl:Cost StartupCost="0" TotalCost="431.000007" Rows="1.000000" Width="8"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="4" Alias="cmin">
<dxl:Ident ColId="4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:ProjElem ColId="0" Alias="a">
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
<dxl:ProjElem ColId="1" Alias="b">
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
<dxl:TableDescriptor Mdid="0.586154.1.1" TableName="s">
<dxl:TableDescriptor Mdid="0.57379.1.0" TableName="foo">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
<dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
<dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
</dxl:TableScan>
......
......@@ -10,22 +10,58 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:OptimizerConfig>
<dxl:EnumeratorConfig Id="0" PlanSamples="0" CostThreshold="0"/>
<dxl:StatisticsConfig DampingFactorFilter="0.750000" DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" MaxStatsBuckets="100"/>
<dxl:CTEConfig CTEInliningCutoff="0"/>
<dxl:WindowOids RowNumber="7000" Rank="7001"/>
<dxl:CTEConfig CTEInliningCutoff="0"/>
<dxl:WindowOids RowNumber="3100" Rank="3101"/>
<dxl:CostModelConfig CostModelType="1" SegmentsForCosting="3">
<dxl:CostParams>
<dxl:CostParam Name="NLJFactor" Value="1.000000" LowerBound="0.500000" UpperBound="1.500000"/>
<dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/>
</dxl:CostParams>
</dxl:CostModelConfig>
<dxl:Hint MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="2147483647" ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="10000000"/>
<dxl:TraceFlags Value="103027,102120,103001,103014,103015,103022,104004,104005,105000"/>
<dxl:Hint MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10"/>
<dxl:TraceFlags Value="102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
</dxl:OptimizerConfig>
<dxl:Metadata SystemIds="0.GPDB">
<dxl:ColumnStatistics Mdid="1.514019.1.1.9" Name="gp_segment_id" Width="4.000000" NullFreq="0.000000" NdvRemain="3.000000" FreqRemain="1.000000" ColStatsMissing="false"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.8" Name="tableoid" Width="4.000000" NullFreq="0.000000" NdvRemain="1.000000" FreqRemain="1.000000" ColStatsMissing="false"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.1" Name="b" Width="8.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.0" Name="a" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:Metadata SystemIds="0.CTAS,0.GPDB">
<dxl:RelationStatistics Mdid="2.57349.1.0" Name="test_ext" Rows="1000000.000000" EmptyRelation="false"/>
<dxl:ExternalRelation Mdid="0.57349.1.0" Name="test_ext" DistributionPolicy="Random" Keys="9,3">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="b" Attno="2" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="c" Attno="3" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="ctid" Attno="-1" Mdid="0.27.1.0" Nullable="false" ColWidth="6">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="xmin" Attno="-3" Mdid="0.28.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="cmin" Attno="-4" Mdid="0.29.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="xmax" Attno="-5" Mdid="0.28.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="cmax" Attno="-6" Mdid="0.29.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="tableoid" Attno="-7" Mdid="0.26.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="gp_segment_id" Attno="-8" Mdid="0.23.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
</dxl:Columns>
<dxl:IndexInfoList/>
<dxl:Triggers/>
<dxl:CheckConstraints/>
</dxl:ExternalRelation>
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2222.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/>
<dxl:EqualityOp Mdid="0.91.1.0"/>
<dxl:InequalityOp Mdid="0.85.1.0"/>
<dxl:LessThanOp Mdid="0.58.1.0"/>
......@@ -40,7 +76,9 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7100.1.0"/>
<dxl:EqualityOp Mdid="0.96.1.0"/>
<dxl:InequalityOp Mdid="0.518.1.0"/>
<dxl:LessThanOp Mdid="0.97.1.0"/>
......@@ -56,6 +94,8 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.25.1.0" Name="text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="true" IsFixedLength="false" Length="-1" PassByValue="false">
<dxl:DistrOpfamily Mdid="0.1995.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7105.1.0"/>
<dxl:EqualityOp Mdid="0.98.1.0"/>
<dxl:InequalityOp Mdid="0.531.1.0"/>
<dxl:LessThanOp Mdid="0.664.1.0"/>
......@@ -70,7 +110,9 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.1990.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7109.1.0"/>
<dxl:EqualityOp Mdid="0.607.1.0"/>
<dxl:InequalityOp Mdid="0.608.1.0"/>
<dxl:LessThanOp Mdid="0.609.1.0"/>
......@@ -85,7 +127,9 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.27.1.0" Name="tid" IsRedistributable="true" IsHashable="false" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="6" PassByValue="false">
<dxl:Type Mdid="0.27.1.0" Name="tid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="6" PassByValue="false">
<dxl:DistrOpfamily Mdid="0.7077.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7110.1.0"/>
<dxl:EqualityOp Mdid="0.387.1.0"/>
<dxl:InequalityOp Mdid="0.402.1.0"/>
<dxl:LessThanOp Mdid="0.2799.1.0"/>
......@@ -100,7 +144,8 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.29.1.0" Name="cid" IsRedistributable="false" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.29.1.0" Name="cid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2226.1.0"/>
<dxl:EqualityOp Mdid="0.385.1.0"/>
<dxl:InequalityOp Mdid="0.0.0.0"/>
<dxl:LessThanOp Mdid="0.0.0.0"/>
......@@ -115,9 +160,10 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="false" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2225.1.0"/>
<dxl:EqualityOp Mdid="0.352.1.0"/>
<dxl:InequalityOp Mdid="0.0.0.0"/>
<dxl:InequalityOp Mdid="0.3315.1.0"/>
<dxl:LessThanOp Mdid="0.0.0.0"/>
<dxl:LessThanEqualsOp Mdid="0.0.0.0"/>
<dxl:GreaterThanOp Mdid="0.0.0.0"/>
......@@ -130,64 +176,22 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:CTASRelation Mdid="5.1.1.0" Schema="public" Name="test" IsTemporary="false" HasOids="false" StorageType="Heap" VarTypeModList="-1,-1,-1" DistributionPolicy="Random">
<dxl:CTASRelation Mdid="5.1.1.0" Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" VarTypeModList="-1,-1,-1" DistributionPolicy="Random">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4">
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="b" Attno="2" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:Column Name="b" Attno="2" Mdid="0.25.1.0" Nullable="true">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="c" Attno="3" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:Column Name="c" Attno="3" Mdid="0.25.1.0" Nullable="true">
<dxl:DefaultValue/>
</dxl:Column>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
</dxl:CTASRelation>
<dxl:ColumnStatistics Mdid="1.514019.1.1.3" Name="ctid" Width="6.000000" NullFreq="0.000000" NdvRemain="1000000.000000" FreqRemain="1.000000" ColStatsMissing="false"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.2" Name="c" Width="8.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.5" Name="cmin" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.4" Name="xmin" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:RelationStatistics Mdid="2.514019.1.1" Name="test_ext" Rows="1000000.000000" EmptyRelation="false"/>
<dxl:ExternalRelation Mdid="0.514019.1.1" Name="test_ext" DistributionPolicy="Random" Keys="9,3">
<dxl:Columns>
<dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="b" Attno="2" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="c" Attno="3" Mdid="0.25.1.0" Nullable="true" ColWidth="8">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="ctid" Attno="-1" Mdid="0.27.1.0" Nullable="false" ColWidth="6">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="xmin" Attno="-3" Mdid="0.28.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="cmin" Attno="-4" Mdid="0.29.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="xmax" Attno="-5" Mdid="0.28.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="cmax" Attno="-6" Mdid="0.29.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="tableoid" Attno="-7" Mdid="0.26.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
<dxl:Column Name="gp_segment_id" Attno="-8" Mdid="0.23.1.0" Nullable="false" ColWidth="4">
<dxl:DefaultValue/>
</dxl:Column>
</dxl:Columns>
<dxl:IndexInfoList/>
<dxl:Triggers/>
<dxl:CheckConstraints/>
</dxl:ExternalRelation>
<dxl:ColumnStatistics Mdid="1.514019.1.1.7" Name="cmax" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
<dxl:ColumnStatistics Mdid="1.514019.1.1.6" Name="xmax" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/>
</dxl:Metadata>
<dxl:Query>
<dxl:OutputColumns>
......@@ -196,36 +200,39 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
<dxl:Ident ColId="3" ColName="c" TypeMdid="0.25.1.0"/>
</dxl:OutputColumns>
<dxl:CTEList/>
<dxl:LogicalCTAS Mdid="5.1.1.0" Schema="public" Name="test" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="1,2,3" VarTypeModList="-1,-1,-1">
<dxl:LogicalCTAS Mdid="5.1.1.0" Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="1,2,3" VarTypeModList="-1,-1,-1">
<dxl:Columns>
<dxl:Column ColId="11" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="12" Attno="2" ColName="b" TypeMdid="0.25.1.0"/>
<dxl:Column ColId="13" Attno="3" ColName="c" TypeMdid="0.25.1.0"/>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
<dxl:LogicalExternalGet>
<dxl:TableDescriptor Mdid="0.514019.1.1" TableName="test_ext">
<dxl:TableDescriptor Mdid="0.57349.1.0" TableName="test_ext">
<dxl:Columns>
<dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="2" Attno="2" ColName="b" TypeMdid="0.25.1.0"/>
<dxl:Column ColId="3" Attno="3" ColName="c" TypeMdid="0.25.1.0"/>
<dxl:Column ColId="4" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
<dxl:Column ColId="5" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="6" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="7" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="8" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="9" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
<dxl:Column ColId="10" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="2" Attno="2" ColName="b" TypeMdid="0.25.1.0" ColWidth="8"/>
<dxl:Column ColId="3" Attno="3" ColName="c" TypeMdid="0.25.1.0" ColWidth="8"/>
<dxl:Column ColId="4" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
<dxl:Column ColId="5" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="6" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="7" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="8" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="9" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
<dxl:Column ColId="10" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
</dxl:LogicalExternalGet>
</dxl:LogicalCTAS>
</dxl:Query>
<dxl:Plan Id="0" SpaceSize="1">
<dxl:PhysicalCTAS Schema="public" Name="test" IsTemporary="false" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="0,1,2" VarTypeModList="-1,-1,-1">
<dxl:PhysicalCTAS Name="fake ctas rel" IsTemporary="true" HasOids="false" StorageType="Heap" DistributionPolicy="Random" InsertColumns="0,1,2" VarTypeModList="-1,-1,-1">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="31731.433333" Rows="1000000.000000" Width="20"/>
</dxl:Properties>
<dxl:DistrOpclasses/>
<dxl:Columns>
<dxl:Column ColId="11" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="12" Attno="2" ColName="b" TypeMdid="0.25.1.0"/>
......@@ -296,18 +303,18 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
<dxl:TableDescriptor Mdid="0.514019.1.1" TableName="test_ext">
<dxl:TableDescriptor Mdid="0.57349.1.0" TableName="test_ext">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.25.1.0"/>
<dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.25.1.0"/>
<dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
<dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
<dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
<dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
<dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.25.1.0" ColWidth="8"/>
<dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.25.1.0" ColWidth="8"/>
<dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
<dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
<dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
<dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
</dxl:ExternalScan>
......
<?xml version="1.0" encoding="UTF-8"?>
<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/">
<dxl:Comment><![CDATA[
CREATE TABLE r1 AS SELECT i AS a, i AS b FROM generate_series(1, 10) i DISTRIBUTED REPLICATED;
]]>
CREATE TABLE r1 AS SELECT i AS a, i AS b FROM generate_series(1, 10) i DISTRIBUTED REPLICATED; ]]>
</dxl:Comment>
<dxl:Thread Id="0">
<dxl:OptimizerConfig>
......@@ -15,11 +14,13 @@
<dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/>
</dxl:CostParams>
</dxl:CostModelConfig>
<dxl:Hint MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
<dxl:TraceFlags Value="102074,102146,102120,103001,103014,103015,103022,103027,104003,104004,104005,105000,106000"/>
<dxl:Hint MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10"/>
<dxl:TraceFlags Value="102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
</dxl:OptimizerConfig>
<dxl:Metadata SystemIds="0.GPDB">
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:Metadata SystemIds="0.CTAS,0.GPDB">
<dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.2222.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/>
<dxl:EqualityOp Mdid="0.91.1.0"/>
<dxl:InequalityOp Mdid="0.85.1.0"/>
<dxl:LessThanOp Mdid="0.58.1.0"/>
......@@ -34,7 +35,9 @@
<dxl:SumAgg Mdid="0.0.0.0"/>
<dxl:CountAgg Mdid="0.2147.1.0"/>
</dxl:Type>
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true">
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
<dxl:LegacyDistrOpfamily Mdid="0.7100.1.0"/>
<dxl:EqualityOp Mdid="0.96.1.0"/>
<dxl:InequalityOp Mdid="0.518.1.0"/>
<dxl:LessThanOp Mdid="0.97.1.0"/>
......@@ -59,8 +62,10 @@
</dxl:Column>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
</dxl:CTASRelation>
<dxl:GPDBFunc Mdid="0.1067.1.0" Name="generate_series" ReturnsSet="true" Stability="Immutable" DataAccess="ReadsSQLData" IsStrict="true">
<dxl:GPDBFunc Mdid="0.1067.1.0" Name="generate_series" ReturnsSet="true" Stability="Immutable" DataAccess="NoSQL" IsStrict="true" IsNDVPreserving="false" IsAllowedForPS="false">
<dxl:ResultType Mdid="0.23.1.0"/>
</dxl:GPDBFunc>
</dxl:Metadata>
......@@ -76,6 +81,8 @@
<dxl:Column ColId="3" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="NOOP"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
<dxl:LogicalTVF FuncId="0.1067.1.0" Name="generate_series" TypeMdid="0.23.1.0">
<dxl:Columns>
<dxl:Column ColId="1" Attno="1" ColName="generate_series" TypeMdid="0.23.1.0"/>
......@@ -90,6 +97,7 @@
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="31.262000" Rows="1000.000000" Width="4"/>
</dxl:Properties>
<dxl:DistrOpclasses/>
<dxl:Columns>
<dxl:Column ColId="2" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:Column ColId="3" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
......
......@@ -381,6 +381,12 @@
<dxl:CTASOption CtasOptionType="653" Name="compression" Value="zlib" IsNull="false"/>
<dxl:CTASOption CtasOptionType="653" Name="appendonly" Value="false" IsNull="false"/>
</dxl:CTASOptions>
<dxl:DistrOpfamilies>
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
</dxl:DistrOpfamilies>
<dxl:DistrOpclasses>
<dxl:DistrOpclass Mdid="0.10027.1.0"/>
</dxl:DistrOpclasses>
</dxl:CTASRelation>
</dxl:Metadata>
</dxl:DXLMessage>
......@@ -13,6 +13,12 @@
<dxl:CTASOption CtasOptionType="653" Name="compression" Value="zlib" IsNull="false"/>
<dxl:CTASOption CtasOptionType="653" Name="appendonly" Value="false" IsNull="false"/>
</dxl:CTASOptions>
<dxl:DistrOpfamilies>
<dxl:DistrOpfamily Mdid="0.1977.1.0"/>
</dxl:DistrOpfamilies>
<dxl:DistrOpclasses>
<dxl:DistrOpclass Mdid="0.10027.1.0"/>
</dxl:DistrOpclasses>
<dxl:LogicalProject>
<dxl:ProjList>
<dxl:ProjElem ColId="2" Alias="a">
......
......@@ -10,6 +10,8 @@
<dxl:Column ColId="3" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:Columns>
<dxl:CTASOptions OnCommitAction="PreserveRows"/>
<dxl:DistrOpfamilies/>
<dxl:DistrOpclasses/>
<dxl:LogicalProject>
<dxl:ProjList>
<dxl:ProjElem ColId="2" Alias="a">
......
......@@ -5,6 +5,9 @@
<dxl:Properties>
<dxl:Cost StartupCost="1.005" TotalCost="5.8" Rows="10" Width="8"/>
</dxl:Properties>
<dxl:DistrOpclasses>
<dxl:DistrOpclass Mdid="0.10027.1.0"/>
</dxl:DistrOpclasses>
<dxl:Columns>
<dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:Columns>
......
......@@ -406,8 +406,6 @@ CMDAccessor::RegisterProvider(CSystemId sysid, IMDProvider *pmdp)
MDPHTAccessor mdhtacc(m_shtProviders, *(a_pmdpelem.Value()));
GPOS_ASSERT(NULL == mdhtacc.Find());
// insert provider in the hash table
mdhtacc.Insert(a_pmdpelem.Value());
a_pmdpelem.Reset();
......
......@@ -2193,13 +2193,19 @@ CTranslatorDXLToExpr::RegisterMDRelationCtas(CDXLLogicalCTAS *pdxlopCTAS)
IntPtrArray *vartypemod_array = pdxlopCTAS->GetVarTypeModArray();
vartypemod_array->AddRef();
IMdIdArray *distr_opfamilies = pdxlopCTAS->GetDistrOpfamilies();
distr_opfamilies->AddRef();
IMdIdArray *distr_opclasses = pdxlopCTAS->GetDistrOpclasses();
distr_opclasses->AddRef();
CMDRelationCtasGPDB *pmdrel = GPOS_NEW(m_mp) CMDRelationCtasGPDB(
m_mp, pdxlopCTAS->MDId(), mdname_schema,
GPOS_NEW(m_mp) CMDName(m_mp, pdxlopCTAS->MdName()->GetMDName()),
pdxlopCTAS->IsTemporary(), pdxlopCTAS->HasOids(),
pdxlopCTAS->RetrieveRelStorageType(), pdxlopCTAS->Ereldistrpolicy(),
mdcol_array, pdxlopCTAS->GetDistrColPosArray(),
pdxlopCTAS->GetDistrOpfamilies(),
mdcol_array, pdxlopCTAS->GetDistrColPosArray(), distr_opfamilies,
distr_opclasses,
GPOS_NEW(m_mp) ULongPtr2dArray(m_mp), // keyset_array,
pdxlopCTAS->GetDxlCtasStorageOption(), vartypemod_array);
......@@ -3861,7 +3867,7 @@ CTranslatorDXLToExpr::AddDistributionColumns(
{
opfamily = pmdrel->GetDistrOpfamilyAt(ul);
GPOS_ASSERT(NULL != opfamily && opfamily->IsValid());
opfamily->AddRef();
//opfamily->AddRef();
}
ptabdesc->AddDistributionColumn(*pulPos, opfamily);
......
......@@ -5732,14 +5732,17 @@ CTranslatorExprToDXL::PdxlnCTAS(CExpression *pexpr,
CMDName(m_mp, pmdrel->GetMdNameSchema()->GetMDName());
}
IMdIdArray *distr_opclasses = pmdrel->GetDistrOpClasses();
distr_opclasses->AddRef();
vartypemod_array->AddRef();
CDXLPhysicalCTAS *pdxlopCTAS = GPOS_NEW(m_mp) CDXLPhysicalCTAS(
m_mp, mdname_schema,
GPOS_NEW(m_mp) CMDName(m_mp, pmdrel->Mdname().GetMDName()),
dxl_col_descr_array, pmdrel->GetDxlCtasStorageOption(),
pmdrel->GetRelDistribution(), pdrgpulDistr, pmdrel->IsTemporary(),
pmdrel->HasOids(), pmdrel->RetrieveRelStorageType(), pdrgpul,
vartypemod_array);
pmdrel->GetRelDistribution(), pdrgpulDistr, pmdrel->GetDistrOpClasses(),
pmdrel->IsTemporary(), pmdrel->HasOids(),
pmdrel->RetrieveRelStorageType(), pdrgpul, vartypemod_array);
CDXLNode *pdxlnCTAS = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopCTAS);
CDXLPhysicalProperties *dxl_properties = GetProperties(pexpr);
......
......@@ -61,6 +61,9 @@ private:
// list of distribution column opfamilies
IMdIdArray *m_distr_opfamilies;
// list of distribution column opclasses for populating dist policy of created table
IMdIdArray *m_distr_opclasses;
// is this a temporary table
BOOL m_is_temp_table;
......@@ -87,8 +90,8 @@ public:
CDXLCtasStorageOptions *dxl_ctas_storage_option,
IMDRelation::Ereldistrpolicy rel_distr_policy,
ULongPtrArray *distr_column_pos_array,
IMdIdArray *distr_opfamilies, BOOL fTemporary,
BOOL fHasOids,
IMdIdArray *distr_opfamilies, IMdIdArray *distr_opclasses,
BOOL fTemporary, BOOL fHasOids,
IMDRelation::Erelstoragetype rel_storage_type,
ULongPtrArray *src_colids_array,
IntPtrArray *vartypemod_array);
......@@ -158,6 +161,13 @@ public:
return m_distr_opfamilies;
}
// distribution column opclasses
IMdIdArray *
GetDistrOpclasses() const
{
return m_distr_opclasses;
}
// source column ids
ULongPtrArray *
GetSrcColidsArray() const
......
......@@ -53,6 +53,9 @@ private:
// list of distribution column positions
ULongPtrArray *m_distr_column_pos_array;
// list of distriution column opclasses
IMdIdArray *m_distr_opclasses;
// is this a temporary table
BOOL m_is_temp_table;
......@@ -78,7 +81,8 @@ public:
CDXLColDescrArray *dxl_col_descr_array,
CDXLCtasStorageOptions *dxl_ctas_storage_options,
IMDRelation::Ereldistrpolicy rel_distr_policy,
ULongPtrArray *distr_column_pos_array, BOOL is_temporary,
ULongPtrArray *distr_column_pos_array,
IMdIdArray *distr_opclasses, BOOL is_temporary,
BOOL has_oids,
IMDRelation::Erelstoragetype rel_storage_type,
ULongPtrArray *src_colids_array,
......@@ -156,6 +160,11 @@ public:
return m_dxl_ctas_storage_option;
}
IMdIdArray *
GetDistrOpclasses() const
{
return m_distr_opclasses;
}
// serialize operator in DXL format
virtual void SerializeToDXL(CXMLSerializer *xml_serializer,
const CDXLNode *dxlnode) const;
......
......@@ -65,9 +65,6 @@ private:
// storage type
IMDRelation::Erelstoragetype m_rel_storage_type;
// distribution opfamilies parse handler
CParseHandlerBase *m_opfamilies_parse_handler;
// private copy ctor
CParseHandlerLogicalCTAS(const CParseHandlerLogicalCTAS &);
......
......@@ -61,9 +61,6 @@ public:
CParseHandlerMDRelationCtas(CMemoryPool *mp,
CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root);
// distribution opfamilies parse handler
CParseHandlerBase *m_opfamilies_parse_handler;
};
} // namespace gpdxl
......
......@@ -477,6 +477,9 @@ enum Edxltoken
EdxltokenRelDistrOpfamilies,
EdxltokenRelDistrOpfamily,
EdxltokenRelDistrOpclasses,
EdxltokenRelDistrOpclass,
EdxltokenExtRelRejLimit,
EdxltokenExtRelRejLimitInRows,
EdxltokenExtRelFmtErrRel,
......
......@@ -80,6 +80,9 @@ private:
// distribution opfamilies
IMdIdArray *m_distr_opfamilies;
// distribution opclasses
IMdIdArray *m_distr_opclasses;
// array of key sets
ULongPtr2dArray *m_keyset_array;
......@@ -107,16 +110,14 @@ private:
public:
// ctor
CMDRelationCtasGPDB(CMemoryPool *mp, IMDId *mdid, CMDName *mdname_schema,
CMDName *mdname, BOOL fTemporary, BOOL fHasOids,
Erelstoragetype rel_storage_type,
Ereldistrpolicy rel_distr_policy,
CMDColumnArray *mdcol_array,
ULongPtrArray *distr_col_array,
IMdIdArray *distr_opfamilies,
ULongPtr2dArray *keyset_array,
CDXLCtasStorageOptions *dxl_ctas_storage_options,
IntPtrArray *vartypemod_array);
CMDRelationCtasGPDB(
CMemoryPool *mp, IMDId *mdid, CMDName *mdname_schema, CMDName *mdname,
BOOL fTemporary, BOOL fHasOids, Erelstoragetype rel_storage_type,
Ereldistrpolicy rel_distr_policy, CMDColumnArray *mdcol_array,
ULongPtrArray *distr_col_array, IMdIdArray *distr_opfamilies,
IMdIdArray *distr_opclasses, ULongPtr2dArray *keyset_array,
CDXLCtasStorageOptions *dxl_ctas_storage_options,
IntPtrArray *vartypemod_array);
// dtor
virtual ~CMDRelationCtasGPDB();
......@@ -233,6 +234,12 @@ public:
// return the position of a column in the metadata object given the attribute number in the system catalog
virtual ULONG GetPosFromAttno(INT attno) const;
virtual IMdIdArray *
GetDistrOpClasses() const
{
return m_distr_opclasses;
}
// retrieve the id of the metadata cache index at the given position
virtual IMDId *IndexMDidAt(ULONG // pos
) const
......
......@@ -31,7 +31,7 @@ CMDRelationCtasGPDB::CMDRelationCtasGPDB(
BOOL fTemporary, BOOL fHasOids, Erelstoragetype rel_storage_type,
Ereldistrpolicy rel_distr_policy, CMDColumnArray *mdcol_array,
ULongPtrArray *distr_col_array, IMdIdArray *distr_opfamiles,
ULongPtr2dArray *keyset_array,
IMdIdArray *distr_opclasses, ULongPtr2dArray *keyset_array,
CDXLCtasStorageOptions *dxl_ctas_storage_options,
IntPtrArray *vartypemod_array)
: m_mp(mp),
......@@ -45,6 +45,7 @@ CMDRelationCtasGPDB::CMDRelationCtasGPDB(
m_md_col_array(mdcol_array),
m_distr_col_array(distr_col_array),
m_distr_opfamilies(distr_opfamiles),
m_distr_opclasses(distr_opclasses),
m_keyset_array(keyset_array),
m_system_columns(0),
m_nondrop_col_pos_array(NULL),
......@@ -110,6 +111,8 @@ CMDRelationCtasGPDB::~CMDRelationCtasGPDB()
CRefCount::SafeRelease(m_nondrop_col_pos_array);
m_dxl_ctas_storage_option->Release();
m_vartypemod_array->Release();
m_distr_opfamilies->Release();
m_distr_opclasses->Release();
}
//---------------------------------------------------------------------------
......@@ -359,13 +362,15 @@ CMDRelationCtasGPDB::Serialize(CXMLSerializer *xml_serializer) const
m_dxl_ctas_storage_option->Serialize(xml_serializer);
// serialize distribution opfamilies
if (EreldistrHash == m_rel_distr_policy && NULL != m_distr_opfamilies)
{
SerializeMDIdList(
xml_serializer, m_distr_opfamilies,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamilies),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamily));
}
SerializeMDIdList(xml_serializer, m_distr_opfamilies,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamilies),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamily));
SerializeMDIdList(xml_serializer, m_distr_opclasses,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclasses),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclass));
xml_serializer->CloseElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
......
......@@ -35,7 +35,7 @@ CDXLLogicalCTAS::CDXLLogicalCTAS(
CDXLCtasStorageOptions *dxl_ctas_storage_options,
IMDRelation::Ereldistrpolicy rel_distr_policy,
ULongPtrArray *distr_column_pos_array, IMdIdArray *distr_opfamilies,
BOOL is_temporary, BOOL has_oids,
IMdIdArray *distr_opclasses, BOOL is_temporary, BOOL has_oids,
IMDRelation::Erelstoragetype rel_storage_type,
ULongPtrArray *src_colids_array, IntPtrArray *vartypemod_array)
: CDXLLogical(mp),
......@@ -47,6 +47,7 @@ CDXLLogicalCTAS::CDXLLogicalCTAS(
m_rel_distr_policy(rel_distr_policy),
m_distr_column_pos_array(distr_column_pos_array),
m_distr_opfamilies(distr_opfamilies),
m_distr_opclasses(distr_opclasses),
m_is_temp_table(is_temporary),
m_has_oids(has_oids),
m_rel_storage_type(rel_storage_type),
......@@ -64,8 +65,10 @@ CDXLLogicalCTAS::CDXLLogicalCTAS(
GPOS_ASSERT(dxl_col_descr_array->Size() == vartypemod_array->Size());
GPOS_ASSERT(IMDRelation::ErelstorageSentinel > rel_storage_type);
GPOS_ASSERT(IMDRelation::EreldistrSentinel > rel_distr_policy);
GPOS_ASSERT(NULL == m_distr_opfamilies ||
GPOS_ASSERT(NULL == m_distr_column_pos_array ||
m_distr_opfamilies->Size() == m_distr_column_pos_array->Size());
GPOS_ASSERT(NULL == m_distr_column_pos_array ||
m_distr_opclasses->Size() == m_distr_column_pos_array->Size());
}
//---------------------------------------------------------------------------
......@@ -86,6 +89,8 @@ CDXLLogicalCTAS::~CDXLLogicalCTAS()
CRefCount::SafeRelease(m_distr_column_pos_array);
m_src_colids_array->Release();
m_vartypemod_array->Release();
m_distr_opfamilies->Release();
m_distr_opclasses->Release();
}
//---------------------------------------------------------------------------
......@@ -233,14 +238,17 @@ CDXLLogicalCTAS::SerializeToDXL(CXMLSerializer *xml_serializer,
m_dxl_ctas_storage_option->Serialize(xml_serializer);
if (IMDRelation::EreldistrHash == m_rel_distr_policy &&
NULL != m_distr_opfamilies)
{
IMDCacheObject::SerializeMDIdList(
xml_serializer, m_distr_opfamilies,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamilies),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamily));
}
IMDCacheObject::SerializeMDIdList(
xml_serializer, m_distr_opfamilies,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamilies),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpfamily));
IMDCacheObject::SerializeMDIdList(
xml_serializer, m_distr_opclasses,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclasses),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclass));
// serialize arguments
dxlnode->SerializeChildrenToDXL(xml_serializer);
......
......@@ -36,7 +36,8 @@ CDXLPhysicalCTAS::CDXLPhysicalCTAS(
CDXLColDescrArray *dxl_col_descr_array,
CDXLCtasStorageOptions *dxl_ctas_opt,
IMDRelation::Ereldistrpolicy rel_distr_policy,
ULongPtrArray *distr_column_pos_array, BOOL is_temporary, BOOL has_oids,
ULongPtrArray *distr_column_pos_array, IMdIdArray *distr_opclasses,
BOOL is_temporary, BOOL has_oids,
IMDRelation::Erelstoragetype rel_storage_type,
ULongPtrArray *src_colids_array, IntPtrArray *vartypemod_array)
: CDXLPhysical(mp),
......@@ -46,6 +47,7 @@ CDXLPhysicalCTAS::CDXLPhysicalCTAS(
m_dxl_ctas_storage_option(dxl_ctas_opt),
m_rel_distr_policy(rel_distr_policy),
m_distr_column_pos_array(distr_column_pos_array),
m_distr_opclasses(distr_opclasses),
m_is_temp_table(is_temporary),
m_has_oids(has_oids),
m_rel_storage_type(rel_storage_type),
......@@ -81,6 +83,7 @@ CDXLPhysicalCTAS::~CDXLPhysicalCTAS()
CRefCount::SafeRelease(m_distr_column_pos_array);
m_src_colids_array->Release();
m_vartypemod_array->Release();
m_distr_opclasses->Release();
}
//---------------------------------------------------------------------------
......@@ -185,6 +188,13 @@ CDXLPhysicalCTAS::SerializeToDXL(CXMLSerializer *xml_serializer,
// serialize properties
dxlnode->SerializePropertiesToDXL(xml_serializer);
// serialize opclasses list
IMDCacheObject::SerializeMDIdList(
xml_serializer, m_distr_opclasses,
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclasses),
CDXLTokens::GetDXLTokenStr(EdxltokenRelDistrOpclass));
// serialize column descriptors
xml_serializer->OpenElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
......
......@@ -43,8 +43,7 @@ CParseHandlerLogicalCTAS::CParseHandlerLogicalCTAS(
m_distr_column_pos_array(NULL),
m_src_colids_array(NULL),
m_vartypemod_array(NULL),
m_is_temp_table(false),
m_opfamilies_parse_handler(NULL)
m_is_temp_table(false)
{
}
......@@ -57,27 +56,11 @@ CParseHandlerLogicalCTAS::CParseHandlerLogicalCTAS(
//
//---------------------------------------------------------------------------
void
CParseHandlerLogicalCTAS::StartElement(const XMLCh *const element_uri,
const XMLCh *const element_local_name,
const XMLCh *const element_qname,
const Attributes &attrs)
CParseHandlerLogicalCTAS::StartElement(
const XMLCh *const element_uri GPOS_UNUSED,
const XMLCh *const element_local_name,
const XMLCh *const element_qname GPOS_UNUSED, const Attributes &attrs)
{
if (0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamilies),
element_local_name))
{
// parse handler for check constraints
m_opfamilies_parse_handler = CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(m_opfamilies_parse_handler);
this->Append(m_opfamilies_parse_handler);
m_opfamilies_parse_handler->startElement(
element_uri, element_local_name, element_qname, attrs);
return;
}
if (0 !=
XMLString::compareString(CDXLTokens::XmlstrToken(EdxltokenLogicalCTAS),
element_local_name))
......@@ -159,6 +142,20 @@ CParseHandlerLogicalCTAS::StartElement(const XMLCh *const element_uri,
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(child_parse_handler);
// parse handler for distr opclasses
CParseHandlerBase *opclasses_parse_handler =
CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(opclasses_parse_handler);
// parse handler for distr opfamilies
CParseHandlerBase *opfamilies_parse_handler =
CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(opfamilies_parse_handler);
//parse handler for the storage options
CParseHandlerBase *ctas_options_parse_handler =
CParseHandlerFactory::GetParseHandler(
......@@ -176,6 +173,8 @@ CParseHandlerLogicalCTAS::StartElement(const XMLCh *const element_uri,
// store child parse handler in array
this->Append(col_descr_parse_handler);
this->Append(ctas_options_parse_handler);
this->Append(opfamilies_parse_handler);
this->Append(opclasses_parse_handler);
this->Append(child_parse_handler);
}
......@@ -203,17 +202,23 @@ CParseHandlerLogicalCTAS::EndElement(const XMLCh *const, // element_uri,
str->GetBuffer());
}
GPOS_ASSERT(3 == this->Length());
GPOS_ASSERT(5 == this->Length());
CParseHandlerColDescr *col_descr_parse_handler =
dynamic_cast<CParseHandlerColDescr *>((*this)[0]);
CParseHandlerCtasStorageOptions *ctas_options_parse_handler =
dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[1]);
CParseHandlerMetadataIdList *opfamilies_parse_handler =
dynamic_cast<CParseHandlerMetadataIdList *>((*this)[2]);
CParseHandlerMetadataIdList *opclasses_parse_handler =
dynamic_cast<CParseHandlerMetadataIdList *>((*this)[3]);
CParseHandlerLogicalOp *child_parse_handler =
dynamic_cast<CParseHandlerLogicalOp *>((*this)[2]);
dynamic_cast<CParseHandlerLogicalOp *>((*this)[4]);
GPOS_ASSERT(NULL != col_descr_parse_handler->GetDXLColumnDescrArray());
GPOS_ASSERT(NULL != ctas_options_parse_handler->GetDxlCtasStorageOption());
GPOS_ASSERT(NULL != opfamilies_parse_handler->GetMdIdArray());
GPOS_ASSERT(NULL != opclasses_parse_handler->GetMdIdArray());
GPOS_ASSERT(NULL != child_parse_handler->CreateDXLNode());
CDXLColDescrArray *dxl_column_descr_array =
......@@ -224,22 +229,25 @@ CParseHandlerLogicalCTAS::EndElement(const XMLCh *const, // element_uri,
ctas_options_parse_handler->GetDxlCtasStorageOption();
dxl_ctas_storage_opt->AddRef();
IMdIdArray *distr_opfamilies = NULL;
if (m_opfamilies_parse_handler != NULL)
{
distr_opfamilies = dynamic_cast<CParseHandlerMetadataIdList *>(
m_opfamilies_parse_handler)
->GetMdIdArray();
distr_opfamilies->AddRef();
}
IMdIdArray *distr_opfamilies =
dynamic_cast<CParseHandlerMetadataIdList *>(opfamilies_parse_handler)
->GetMdIdArray();
distr_opfamilies->AddRef();
IMdIdArray *distr_opclasses =
dynamic_cast<CParseHandlerMetadataIdList *>(opclasses_parse_handler)
->GetMdIdArray();
distr_opclasses->AddRef();
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(
m_mp,
GPOS_NEW(m_mp) CDXLLogicalCTAS(
m_mp, m_mdid, m_mdname_schema, m_mdname, dxl_column_descr_array,
dxl_ctas_storage_opt, m_rel_distr_policy, m_distr_column_pos_array,
distr_opfamilies, m_is_temp_table, m_has_oids, m_rel_storage_type,
m_src_colids_array, m_vartypemod_array));
distr_opfamilies, distr_opclasses, m_is_temp_table, m_has_oids,
m_rel_storage_type, m_src_colids_array, m_vartypemod_array));
AddChildFromParseHandler(child_parse_handler);
......
......@@ -44,8 +44,7 @@ CParseHandlerMDRelationCtas::CParseHandlerMDRelationCtas(
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root)
: CParseHandlerMDRelation(mp, parse_handler_mgr, parse_handler_root),
m_vartypemod_array(NULL),
m_opfamilies_parse_handler(NULL)
m_vartypemod_array(NULL)
{
}
......@@ -58,27 +57,11 @@ CParseHandlerMDRelationCtas::CParseHandlerMDRelationCtas(
//
//---------------------------------------------------------------------------
void
CParseHandlerMDRelationCtas::StartElement(const XMLCh *const element_uri,
CParseHandlerMDRelationCtas::StartElement(const XMLCh *const,
const XMLCh *const element_local_name,
const XMLCh *const element_qname,
const XMLCh *const,
const Attributes &attrs)
{
if (0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamilies),
element_local_name))
{
// parse handler for check constraints
m_opfamilies_parse_handler = CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(m_opfamilies_parse_handler);
this->Append(m_opfamilies_parse_handler);
m_opfamilies_parse_handler->startElement(
element_uri, element_local_name, element_qname, attrs);
return;
}
if (0 !=
XMLString::compareString(CDXLTokens::XmlstrToken(EdxltokenRelationCTAS),
element_local_name))
......@@ -130,6 +113,20 @@ CParseHandlerMDRelationCtas::StartElement(const XMLCh *const element_uri,
m_parse_handler_mgr->GetDXLMemoryManager(), vartypemod_xml,
EdxltokenVarTypeModList, EdxltokenRelation);
// parse handler for distr opclasses
CParseHandlerBase *opclasses_parse_handler =
CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(opclasses_parse_handler);
// parse handler for distr opfamilies
CParseHandlerBase *opfamilies_parse_handler =
CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(opfamilies_parse_handler);
//parse handler for the storage options
CParseHandlerBase *ctas_options_parse_handler =
CParseHandlerFactory::GetParseHandler(
......@@ -147,6 +144,8 @@ CParseHandlerMDRelationCtas::StartElement(const XMLCh *const element_uri,
// store parse handlers
this->Append(columns_parse_handler);
this->Append(ctas_options_parse_handler);
this->Append(opfamilies_parse_handler);
this->Append(opclasses_parse_handler);
}
//---------------------------------------------------------------------------
......@@ -177,9 +176,15 @@ CParseHandlerMDRelationCtas::EndElement(const XMLCh *const, // element_uri,
dynamic_cast<CParseHandlerMetadataColumns *>((*this)[0]);
CParseHandlerCtasStorageOptions *ctas_options_parse_handler =
dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[1]);
CParseHandlerMetadataIdList *opfamilies_parse_handler =
dynamic_cast<CParseHandlerMetadataIdList *>((*this)[2]);
CParseHandlerMetadataIdList *opclasses_parse_handler =
dynamic_cast<CParseHandlerMetadataIdList *>((*this)[3]);
GPOS_ASSERT(NULL != md_cols_parse_handler->GetMdColArray());
GPOS_ASSERT(NULL != ctas_options_parse_handler->GetDxlCtasStorageOption());
GPOS_ASSERT(NULL != opfamilies_parse_handler->GetMdIdArray());
GPOS_ASSERT(NULL != opclasses_parse_handler->GetMdIdArray());
CMDColumnArray *md_col_array = md_cols_parse_handler->GetMdColArray();
CDXLCtasStorageOptions *dxl_ctas_storage_options =
......@@ -188,21 +193,22 @@ CParseHandlerMDRelationCtas::EndElement(const XMLCh *const, // element_uri,
md_col_array->AddRef();
dxl_ctas_storage_options->AddRef();
IMdIdArray *distr_opfamilies = NULL;
if (m_rel_distr_policy == IMDRelation::EreldistrHash &&
m_opfamilies_parse_handler != NULL)
{
distr_opfamilies = dynamic_cast<CParseHandlerMetadataIdList *>(
m_opfamilies_parse_handler)
->GetMdIdArray();
distr_opfamilies->AddRef();
}
IMdIdArray *distr_opfamilies =
dynamic_cast<CParseHandlerMetadataIdList *>(opfamilies_parse_handler)
->GetMdIdArray();
distr_opfamilies->AddRef();
IMdIdArray *distr_opclasses =
dynamic_cast<CParseHandlerMetadataIdList *>(opclasses_parse_handler)
->GetMdIdArray();
distr_opclasses->AddRef();
m_imd_obj = GPOS_NEW(m_mp) CMDRelationCtasGPDB(
m_mp, m_mdid, m_mdname_schema, m_mdname, m_is_temp_table, m_has_oids,
m_rel_storage_type, m_rel_distr_policy, md_col_array, m_distr_col_array,
distr_opfamilies, m_key_sets_arrays, dxl_ctas_storage_options,
m_vartypemod_array);
distr_opfamilies, distr_opclasses, m_key_sets_arrays,
dxl_ctas_storage_options, m_vartypemod_array);
// deactivate handler
m_parse_handler_mgr->DeactivateHandler();
......
......@@ -138,7 +138,7 @@ CParseHandlerMetadataIdList::StartElement(const XMLCh *const, // element_uri,
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamily),
element_local_name))
{
// opclass metadata id: array must be initialized already
// distr opfamily metadata id: array must be initialized already
GPOS_ASSERT(NULL != m_mdid_array);
IMDId *mdid = CDXLOperatorFactory::ExtractConvertAttrValueToMdId(
......@@ -146,6 +146,18 @@ CParseHandlerMetadataIdList::StartElement(const XMLCh *const, // element_uri,
EdxltokenRelDistrOpfamily);
m_mdid_array->Append(mdid);
}
else if (0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpclass),
element_local_name))
{
// distr opclass metadata id: array must be initialized already
GPOS_ASSERT(NULL != m_mdid_array);
IMDId *mdid = CDXLOperatorFactory::ExtractConvertAttrValueToMdId(
m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenMdid,
EdxltokenRelDistrOpclass);
m_mdid_array->Append(mdid);
}
else
{
CWStringDynamic *str = CDXLUtils::CreateDynamicStringFromXMLChArray(
......@@ -183,6 +195,9 @@ CParseHandlerMetadataIdList::EndElement(const XMLCh *const, // element_uri,
element_local_name) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamilies),
element_local_name) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpclasses),
element_local_name))
{
// end the index or partition metadata id list
......@@ -223,7 +238,9 @@ CParseHandlerMetadataIdList::FSupportedElem(const XMLCh *const xml_str)
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenOpfamily), xml_str) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamily), xml_str));
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamily), xml_str) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpclass), xml_str));
}
//---------------------------------------------------------------------------
......@@ -246,9 +263,11 @@ CParseHandlerMetadataIdList::FSupportedListType(const XMLCh *const xml_str)
CDXLTokens::XmlstrToken(EdxltokenCheckConstraints), xml_str) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenOpfamilies), xml_str) ||
0 ==
XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamilies), xml_str));
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpfamilies),
xml_str) ||
0 == XMLString::compareString(
CDXLTokens::XmlstrToken(EdxltokenRelDistrOpclasses), xml_str));
}
//---------------------------------------------------------------------------
......
......@@ -14,6 +14,7 @@
#include "naucrates/dxl/parser/CParseHandlerColDescr.h"
#include "naucrates/dxl/parser/CParseHandlerCtasStorageOptions.h"
#include "naucrates/dxl/parser/CParseHandlerMetadataIdList.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
#include "naucrates/dxl/parser/CParseHandlerProperties.h"
#include "naucrates/dxl/parser/CParseHandlerUtils.h"
......@@ -158,6 +159,13 @@ CParseHandlerPhysicalCTAS::StartElement(const XMLCh *const, // element_uri,
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(col_descr_parse_handler);
//parse handler for distr opclasses
CParseHandlerBase *opclasses_parse_handler =
CParseHandlerFactory::GetParseHandler(
m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(opclasses_parse_handler);
//parse handler for the properties of the operator
CParseHandlerBase *prop_parse_handler =
CParseHandlerFactory::GetParseHandler(
......@@ -167,6 +175,7 @@ CParseHandlerPhysicalCTAS::StartElement(const XMLCh *const, // element_uri,
// store child parse handler in array
this->Append(prop_parse_handler);
this->Append(opclasses_parse_handler);
this->Append(col_descr_parse_handler);
this->Append(ctas_options_parse_handler);
this->Append(proj_list_parse_handler);
......@@ -197,21 +206,24 @@ CParseHandlerPhysicalCTAS::EndElement(const XMLCh *const, // element_uri,
str->GetBuffer());
}
GPOS_ASSERT(5 == this->Length());
GPOS_ASSERT(6 == this->Length());
CParseHandlerProperties *prop_parse_handler =
dynamic_cast<CParseHandlerProperties *>((*this)[0]);
CParseHandlerMetadataIdList *opclasses_parse_handler =
dynamic_cast<CParseHandlerMetadataIdList *>((*this)[1]);
CParseHandlerColDescr *col_descr_parse_handler =
dynamic_cast<CParseHandlerColDescr *>((*this)[1]);
dynamic_cast<CParseHandlerColDescr *>((*this)[2]);
CParseHandlerCtasStorageOptions *ctas_options_parse_handler =
dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[2]);
dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[3]);
CParseHandlerProjList *proj_list_parse_handler =
dynamic_cast<CParseHandlerProjList *>((*this)[3]);
dynamic_cast<CParseHandlerProjList *>((*this)[4]);
GPOS_ASSERT(NULL != proj_list_parse_handler->CreateDXLNode());
CParseHandlerPhysicalOp *child_parse_handler =
dynamic_cast<CParseHandlerPhysicalOp *>((*this)[4]);
dynamic_cast<CParseHandlerPhysicalOp *>((*this)[5]);
GPOS_ASSERT(NULL != prop_parse_handler->GetProperties());
GPOS_ASSERT(NULL != opclasses_parse_handler->GetMdIdArray());
GPOS_ASSERT(NULL != col_descr_parse_handler->GetDXLColumnDescrArray());
GPOS_ASSERT(NULL != ctas_options_parse_handler->GetDxlCtasStorageOption());
GPOS_ASSERT(NULL != proj_list_parse_handler->CreateDXLNode());
......@@ -225,12 +237,15 @@ CParseHandlerPhysicalCTAS::EndElement(const XMLCh *const, // element_uri,
ctas_options_parse_handler->GetDxlCtasStorageOption();
ctas_options->AddRef();
IMdIdArray *opclasses_array = opclasses_parse_handler->GetMdIdArray();
opclasses_array->AddRef();
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(
m_mp, GPOS_NEW(m_mp) CDXLPhysicalCTAS(
m_mp, m_mdname_schema, m_mdname, dxl_col_descr_array,
ctas_options, m_rel_distr_policy, m_distr_column_pos_array,
m_is_temp_table, m_has_oids, m_rel_storage_type,
m_src_colids_array, m_vartypemod_array));
opclasses_array, m_is_temp_table, m_has_oids,
m_rel_storage_type, m_src_colids_array, m_vartypemod_array));
// set statistics and physical properties
CParseHandlerUtils::SetProperties(m_dxl_node, prop_parse_handler);
......
......@@ -526,6 +526,9 @@ CDXLTokens::Init(CMemoryPool *mp)
{EdxltokenRelDistrOpfamilies, GPOS_WSZ_LIT("DistrOpfamilies")},
{EdxltokenRelDistrOpfamily, GPOS_WSZ_LIT("DistrOpfamily")},
{EdxltokenRelDistrOpclasses, GPOS_WSZ_LIT("DistrOpclasses")},
{EdxltokenRelDistrOpclass, GPOS_WSZ_LIT("DistrOpclass")},
{EdxltokenExtRelRejLimit, GPOS_WSZ_LIT("RejectLimit")},
{EdxltokenExtRelRejLimitInRows, GPOS_WSZ_LIT("RejectLimitInRows")},
{EdxltokenExtRelFmtErrRel, GPOS_WSZ_LIT("FormatErrorRelId")},
......
......@@ -461,3 +461,57 @@ select * from try_distinct_array a, try_distinct_array b where a.test_array=b.te
y | {1,1} | n | {1,1}
(4 rows)
-- CTAS should use value of gp_use_legacy_hashops when setting the distribution policy based on an existing table
set gp_use_legacy_hashops=on;
create table ctas_base_legacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=off;
create table ctas_from_legacy as select * from ctas_base_legacy distributed by (col);
create table ctas_explicit_legacy as select * from ctas_base_legacy distributed by (col cdbhash_int4_ops);
create table ctas_base_nonlegacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=on;
create table ctas_from_nonlegacy as select * from ctas_base_nonlegacy distributed by (col);
create table ctas_explicit_nonlegacy as select * from ctas_base_nonlegacy distributed by (col int4_ops);
select dp.localoid::regclass as name, opc.opcname
from gp_distribution_policy dp
join pg_opclass opc
on ARRAY[opc.oid]::oidvector = dp.distclass
where dp.localoid in ('ctas_base_legacy'::regclass,
'ctas_from_legacy'::regclass,
'ctas_base_nonlegacy'::regclass,
'ctas_from_nonlegacy'::regclass,
'ctas_explicit_legacy'::regclass,
'ctas_explicit_nonlegacy'::regclass);
name | opcname
-------------------------+------------------
ctas_explicit_nonlegacy | int4_ops
ctas_base_nonlegacy | int4_ops
ctas_from_legacy | int4_ops
ctas_from_nonlegacy | cdbhash_int4_ops
ctas_explicit_legacy | cdbhash_int4_ops
ctas_base_legacy | cdbhash_int4_ops
(6 rows)
select * from ctas_from_legacy where col=1;
col
-----
1
(1 row)
select * from ctas_explicit_legacy where col=1;
col
-----
1
(1 row)
select * from ctas_from_nonlegacy where col=1;
col
-----
1
(1 row)
select * from ctas_explicit_nonlegacy where col=1;
col
-----
1
(1 row)
......@@ -457,3 +457,57 @@ select * from try_distinct_array a, try_distinct_array b where a.test_array=b.te
y | {1,1} | n | {1,1}
(4 rows)
-- CTAS should use value of gp_use_legacy_hashops when setting the distribution policy based on an existing table
set gp_use_legacy_hashops=on;
create table ctas_base_legacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=off;
create table ctas_from_legacy as select * from ctas_base_legacy distributed by (col);
create table ctas_explicit_legacy as select * from ctas_base_legacy distributed by (col cdbhash_int4_ops);
create table ctas_base_nonlegacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=on;
create table ctas_from_nonlegacy as select * from ctas_base_nonlegacy distributed by (col);
create table ctas_explicit_nonlegacy as select * from ctas_base_nonlegacy distributed by (col int4_ops);
select dp.localoid::regclass as name, opc.opcname
from gp_distribution_policy dp
join pg_opclass opc
on ARRAY[opc.oid]::oidvector = dp.distclass
where dp.localoid in ('ctas_base_legacy'::regclass,
'ctas_from_legacy'::regclass,
'ctas_base_nonlegacy'::regclass,
'ctas_from_nonlegacy'::regclass,
'ctas_explicit_legacy'::regclass,
'ctas_explicit_nonlegacy'::regclass);
name | opcname
-------------------------+------------------
ctas_explicit_nonlegacy | int4_ops
ctas_base_nonlegacy | int4_ops
ctas_from_legacy | int4_ops
ctas_from_nonlegacy | cdbhash_int4_ops
ctas_explicit_legacy | cdbhash_int4_ops
ctas_base_legacy | cdbhash_int4_ops
(6 rows)
select * from ctas_from_legacy where col=1;
col
-----
1
(1 row)
select * from ctas_explicit_legacy where col=1;
col
-----
1
(1 row)
select * from ctas_from_nonlegacy where col=1;
col
-----
1
(1 row)
select * from ctas_explicit_nonlegacy where col=1;
col
-----
1
(1 row)
......@@ -231,7 +231,6 @@ select dp.localoid::regclass::name as name, oc.opcname
on oc.oid::text = dp.distclass::text
where dp.localoid in ('ctastest_on'::regclass::oid,
'ctastest_off'::regclass::oid);
set gp_use_legacy_hashops=on;
create table try_distinct_array (test_char varchar,test_array integer[]);
insert into try_distinct_array select 'y',string_to_array('1~1','~')::int[];
......@@ -242,3 +241,30 @@ select distinct test_array from try_distinct_array;
-- Hash join on column that does not have legacy hashop
explain (costs off) select * from try_distinct_array a, try_distinct_array b where a.test_array=b.test_array;
select * from try_distinct_array a, try_distinct_array b where a.test_array=b.test_array;
-- CTAS should use value of gp_use_legacy_hashops when setting the distribution policy based on an existing table
set gp_use_legacy_hashops=on;
create table ctas_base_legacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=off;
create table ctas_from_legacy as select * from ctas_base_legacy distributed by (col);
create table ctas_explicit_legacy as select * from ctas_base_legacy distributed by (col cdbhash_int4_ops);
create table ctas_base_nonlegacy as select unnest(array[1,2,3]) as col distributed by (col);
set gp_use_legacy_hashops=on;
create table ctas_from_nonlegacy as select * from ctas_base_nonlegacy distributed by (col);
create table ctas_explicit_nonlegacy as select * from ctas_base_nonlegacy distributed by (col int4_ops);
select dp.localoid::regclass as name, opc.opcname
from gp_distribution_policy dp
join pg_opclass opc
on ARRAY[opc.oid]::oidvector = dp.distclass
where dp.localoid in ('ctas_base_legacy'::regclass,
'ctas_from_legacy'::regclass,
'ctas_base_nonlegacy'::regclass,
'ctas_from_nonlegacy'::regclass,
'ctas_explicit_legacy'::regclass,
'ctas_explicit_nonlegacy'::regclass);
select * from ctas_from_legacy where col=1;
select * from ctas_explicit_legacy where col=1;
select * from ctas_from_nonlegacy where col=1;
select * from ctas_explicit_nonlegacy where col=1;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册