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]

Reply via email to