This is an automated email from the ASF dual-hosted git repository.
chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
The following commit(s) were added to refs/heads/cbdb-postgres-merge by this
push:
new b8b59706789 Fix some errors in vacuum
b8b59706789 is described below
commit b8b5970678997ccacab2a5610bb0146168e380ad
Author: Jinbao Chen <[email protected]>
AuthorDate: Thu Nov 13 00:05:43 2025 +0800
Fix some errors in vacuum
---
src/backend/commands/analyze.c | 32 +++++++++++++++++++++++++++++---
src/backend/commands/vacuum.c | 22 +++++++++++++++++++---
src/test/regress/expected/vacuum.out | 36 ++++++++++++++++--------------------
3 files changed, 64 insertions(+), 26 deletions(-)
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index cb436576d83..f2fff2c8607 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -748,6 +748,35 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
}
}
+ {
+ List *tableOIDs;
+ /*
+ * Find all members of inheritance set. We only need
AccessShareLock on
+ * the children.
+ */
+ tableOIDs =
+ find_all_inheritors(RelationGetRelid(onerel),
AccessShareLock, NULL);
+
+ /*
+ * Check that there's at least one descendant, else fail. This
could
+ * happen despite analyze_rel's relhassubclass check, if table
once had a
+ * child but no longer does. In that case, we can clear the
+ * relhassubclass field so as not to make the same mistake
again later.
+ * (This is safe because we hold ShareUpdateExclusiveLock.)
+ * Please refer to
https://github.com/greenplum-db/gpdb/issues/14644
+ */
+ if (list_length(tableOIDs) < 2)
+ {
+ /* CCI because we already updated the pg_class row in
this command */
+ CommandCounterIncrement();
+ SetRelationHasSubclass(RelationGetRelid(onerel), false);
+ ereport(elevel,
+ (errmsg("skipping analyze of \"%s.%s\"
inheritance tree --- this inheritance tree contains no child tables",
+
get_namespace_name(RelationGetNamespace(onerel)),
+
RelationGetRelationName(onerel))));
+ }
+ }
+
sample_needed = needs_sample(onerel, vacattrstats, attr_cnt);
if (ctx || sample_needed)
{
@@ -1983,9 +2012,6 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
*/
if (list_length(tableOIDs) < 2)
{
- /* CCI because we already updated the pg_class row in this
command */
- CommandCounterIncrement();
- SetRelationHasSubclass(RelationGetRelid(onerel), false);
*totalrows = 0;
*totaldeadrows = 0;
ereport(elevel,
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 936aa9bcda9..bcb850aea2f 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -445,7 +445,8 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool
isTopLevel, bool auto_s
VACOPT_VERBOSE |
VACOPT_PROCESS_MAIN |
VACOPT_PROCESS_TOAST
|
-
VACOPT_ONLY_DATABASE_STATS))
+
VACOPT_ONLY_DATABASE_STATS |
+
VACOPT_UPDATE_DATFROZENXID))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("ONLY_DATABASE_STATS cannot be
specified with other VACUUM options")));
@@ -3401,11 +3402,14 @@ vacuum_params_to_options_list(VacuumParams *params)
options = lappend(options, makeDefElem("skip_locked", (Node *)
makeInteger(1), -1));
optmask &= ~VACOPT_SKIP_LOCKED;
}
- if (optmask & VACOPT_PROCESS_MAIN)
+ if (!(optmask & VACOPT_PROCESS_MAIN))
{
- options = lappend(options, makeDefElem("process_main", (Node *)
makeInteger(1), -1));
+ options = lappend(options, makeDefElem("process_main", (Node *)
makeInteger(0), -1));
optmask &= ~VACOPT_PROCESS_MAIN;
}
+ else
+ optmask &= ~VACOPT_PROCESS_MAIN;
+
if (optmask & VACOPT_PROCESS_TOAST)
{
/* GPDB_14_MERGE_FIXME: skip_toast is replaced by
process_toast, need to check */
@@ -3418,6 +3422,18 @@ vacuum_params_to_options_list(VacuumParams *params)
optmask &= ~VACOPT_DISABLE_PAGE_SKIPPING;
}
+ if ((optmask & VACOPT_SKIP_DATABASE_STATS))
+ {
+ options = lappend(options, makeDefElem("skip_database_stats",
(Node *) makeInteger(1), -1));
+ optmask &= ~VACOPT_SKIP_DATABASE_STATS;
+ }
+ if ((optmask & VACOPT_ONLY_DATABASE_STATS))
+ {
+ options = lappend(options, makeDefElem("only_database_stats",
(Node *) makeInteger(1), -1));
+ optmask &= ~VACOPT_ONLY_DATABASE_STATS;
+ }
+
+
if (optmask & VACUUM_AO_PHASE_MASK)
{
options = lappend(options, makeDefElem("ao_phase",
diff --git a/src/test/regress/expected/vacuum.out
b/src/test/regress/expected/vacuum.out
index 7e5efcb95bf..93bb198ef79 100644
--- a/src/test/regress/expected/vacuum.out
+++ b/src/test/regress/expected/vacuum.out
@@ -344,19 +344,17 @@ CREATE VIEW vac_option_tab_counts AS
ORDER BY rel;
VACUUM (PROCESS_TOAST TRUE) vac_option_tab;
SELECT * FROM vac_option_tab_counts;
- rel | vacuum_count
--------+--------------
- main | 1
- toast | 1
-(2 rows)
+ rel | vacuum_count
+------+--------------
+ main | 1
+(1 row)
VACUUM (PROCESS_TOAST FALSE) vac_option_tab;
SELECT * FROM vac_option_tab_counts;
- rel | vacuum_count
--------+--------------
- main | 2
- toast | 1
-(2 rows)
+ rel | vacuum_count
+------+--------------
+ main | 2
+(1 row)
VACUUM (PROCESS_TOAST FALSE, FULL) vac_option_tab; -- error
ERROR: PROCESS_TOAST required with VACUUM FULL
@@ -364,20 +362,18 @@ ERROR: PROCESS_TOAST required with VACUUM FULL
-- Only the toast table is processed.
VACUUM (PROCESS_MAIN FALSE) vac_option_tab;
SELECT * FROM vac_option_tab_counts;
- rel | vacuum_count
--------+--------------
- main | 2
- toast | 2
-(2 rows)
+ rel | vacuum_count
+------+--------------
+ main | 2
+(1 row)
-- Nothing is processed.
VACUUM (PROCESS_MAIN FALSE, PROCESS_TOAST FALSE) vac_option_tab;
SELECT * FROM vac_option_tab_counts;
- rel | vacuum_count
--------+--------------
- main | 2
- toast | 2
-(2 rows)
+ rel | vacuum_count
+------+--------------
+ main | 2
+(1 row)
-- Check if the filenodes nodes have been updated as wanted after FULL.
SELECT relfilenode AS main_filenode FROM pg_class
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]