@ -201,8 +201,7 @@ analyze_rel(Oid relid, RangeVar *relation, int options,
* locked the relation .
*/
if ( onerel - > rd_rel - > relkind = = RELKIND_RELATION | |
onerel - > rd_rel - > relkind = = RELKIND_MATVIEW | |
onerel - > rd_rel - > relkind = = RELKIND_PARTITIONED_TABLE )
onerel - > rd_rel - > relkind = = RELKIND_MATVIEW )
{
/* Regular table, so we'll use the regular row acquisition function */
acquirefunc = acquire_sample_rows ;
@ -234,6 +233,12 @@ analyze_rel(Oid relid, RangeVar *relation, int options,
return ;
}
}
else if ( onerel - > rd_rel - > relkind = = RELKIND_PARTITIONED_TABLE )
{
/*
* For partitioned tables , we want to do the recursive ANALYZE below .
*/
}
else
{
/* No need for a WARNING if we already complained during VACUUM */
@ -253,10 +258,12 @@ analyze_rel(Oid relid, RangeVar *relation, int options,
LWLockRelease ( ProcArrayLock ) ;
/*
* Do the normal non - recursive ANALYZE .
* Do the normal non - recursive ANALYZE . We can skip this for partitioned
* tables , which don ' t contain any rows .
*/
do_analyze_rel ( onerel , options , params , va_cols , acquirefunc , relpages ,
false , in_outer_xact , elevel ) ;
if ( onerel - > rd_rel - > relkind ! = RELKIND_PARTITIONED_TABLE )
do_analyze_rel ( onerel , options , params , va_cols , acquirefunc ,
relpages , false , in_outer_xact , elevel ) ;
/*
* If there are child tables , do recursive ANALYZE .
@ -1260,6 +1267,7 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
nrels ,
i ;
ListCell * lc ;
bool has_child ;
/*
* Find all members of inheritance set . We only need AccessShareLock on
@ -1297,6 +1305,7 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
relblocks = ( double * ) palloc ( list_length ( tableOIDs ) * sizeof ( double ) ) ;
totalblocks = 0 ;
nrels = 0 ;
has_child = false ;
foreach ( lc , tableOIDs )
{
Oid childOID = lfirst_oid ( lc ) ;
@ -1318,8 +1327,7 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
/* Check table type (MATVIEW can't happen, but might as well allow) */
if ( childrel - > rd_rel - > relkind = = RELKIND_RELATION | |
childrel - > rd_rel - > relkind = = RELKIND_MATVIEW | |
childrel - > rd_rel - > relkind = = RELKIND_PARTITIONED_TABLE )
childrel - > rd_rel - > relkind = = RELKIND_MATVIEW )
{
/* Regular table, so use the regular row acquisition function */
acquirefunc = acquire_sample_rows ;
@ -1351,13 +1359,17 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
}
else
{
/* ignore, but release the lock on it */
Assert ( childrel ! = onerel ) ;
/*
* ignore , but release the lock on it . could be a partitioned
* table .
*/
if ( childrel ! = onerel )
heap_close ( childrel , AccessShareLock ) ;
continue ;
}
/* OK, we'll process this child */
has_child = true ;
rels [ nrels ] = childrel ;
acquirefuncs [ nrels ] = acquirefunc ;
relblocks [ nrels ] = ( double ) relpages ;
@ -1366,9 +1378,10 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
}
/*
* If we don ' t have at least two tables to consider , fail .
* If we don ' t have at least one child table to consider , fail . If the
* relation is a partitioned table , it ' s not counted as a child table .
*/
if ( nrels < 2 )
if ( ! has_child )
{
ereport ( elevel ,
( errmsg ( " skipping analyze of \" %s.%s \" inheritance tree --- this inheritance tree contains no analyzable child tables " ,