This is an automated email from the ASF dual-hosted git repository.

avamingli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 22410a7a5b9098da5c9e6d9288cfaa956952374d
Author: chaotian <[email protected]>
AuthorDate: Mon May 29 20:04:53 2023 +0800

    Refactor AO macro RelationIsAppendOptimized (#15546)
    
    This PR aims to refactor macro RelationIsAppendOptimized  which includes 
partition check in GP7.
    Compared to GP6, now we didn't create auxiliary tables for the partition 
table because it doesn't
    store any data in real, and that's the reason caused some bugs and it's 
also the motivation for refactoring it.
    Removed partition check in `RelationIsAppendOptimized `, then consistent 
with GP6 in behavior,
    add a new macro `RelationStorageIsAO` which stands for table store data in 
real and has auxiliary tables
    except root partition table.
    - For callsite of RelationStorageIsAO
    if it's according to aux tables or storage, like most code related to 
storage and executor
    - For callsite of RelationIsAppendOptimized
    mainly concentrate on root partition table, like in parser and planner.
---
 src/backend/access/appendonly/aomd.c               |   2 +-
 src/backend/access/appendonly/aosegfiles.c         |   2 +-
 .../access/appendonly/appendonly_blkdir_udf.c      |   2 +-
 .../access/appendonly/appendonly_compaction.c      |   6 +-
 .../access/appendonly/appendonly_visimap_udf.c     |   6 +-
 src/backend/access/brin/brin.c                     |   8 +-
 src/backend/catalog/aoblkdir.c                     |   2 +-
 src/backend/catalog/aocatalog.c                    |   2 +-
 src/backend/catalog/aovisimap.c                    |   2 +-
 src/backend/catalog/heap.c                         |   6 +-
 src/backend/catalog/index.c                        |   4 +-
 src/backend/catalog/pg_appendonly.c                |   4 +-
 src/backend/commands/analyze.c                     |   2 +-
 src/backend/commands/cluster.c                     |   2 +
 src/backend/commands/indexcmds.c                   |   2 +-
 src/backend/commands/tablecmds.c                   |  10 +-
 src/backend/commands/vacuum.c                      |   5 +-
 src/backend/commands/vacuum_ao.c                   |   4 +-
 src/backend/executor/nodeBitmapHeapscan.c          |   2 +-
 src/backend/parser/parse_utilcmd.c                 |   2 +-
 src/backend/utils/adt/dbsize.c                     |   2 +-
 src/backend/utils/cache/relcache.c                 |   4 +-
 src/include/utils/rel.h                            |   6 +-
 src/test/isolation2/expected/lockmodes.out         | 105 +++++++++++++++++++++
 24 files changed, 154 insertions(+), 38 deletions(-)

diff --git a/src/backend/access/appendonly/aomd.c 
b/src/backend/access/appendonly/aomd.c
index 92e54a6bf8..d24f599b5e 100644
--- a/src/backend/access/appendonly/aomd.c
+++ b/src/backend/access/appendonly/aomd.c
@@ -640,7 +640,7 @@ ao_rel_get_physical_size(Relation aorel)
        Oid                     segrelid;
        uint64          total_physical_size = 0;
 
-       Assert(RelationIsAppendOptimized(aorel));
+       Assert(RelationStorageIsAO(aorel));
 
        GetAppendOnlyEntryAuxOids(aorel,
                                                          &segrelid, NULL, 
NULL, NULL, NULL);
diff --git a/src/backend/access/appendonly/aosegfiles.c 
b/src/backend/access/appendonly/aosegfiles.c
index 92f6996d51..1668958838 100644
--- a/src/backend/access/appendonly/aosegfiles.c
+++ b/src/backend/access/appendonly/aosegfiles.c
@@ -1381,7 +1381,7 @@ get_ao_distribution(PG_FUNCTION_ARGS)
                /*
                 * verify this is an AO relation
                 */
-               if (!RelationIsAppendOptimized(parentrel))
+               if (!RelationStorageIsAO(parentrel))
                        ereport(ERROR,
                                        
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                         errmsg("'%s' is not an append-only 
relation",
diff --git a/src/backend/access/appendonly/appendonly_blkdir_udf.c 
b/src/backend/access/appendonly/appendonly_blkdir_udf.c
index 5ceb6ef00b..9e2b6e99ff 100644
--- a/src/backend/access/appendonly/appendonly_blkdir_udf.c
+++ b/src/backend/access/appendonly/appendonly_blkdir_udf.c
@@ -92,7 +92,7 @@ gp_aoblkdir(PG_FUNCTION_ARGS)
                /* initialize Context for SRF */
                context = (Context *) palloc0(sizeof(Context));
                context->aorel = table_open(aoRelOid, AccessShareLock);
-               if (!RelationIsAppendOptimized(context->aorel))
+               if (!RelationStorageIsAO(context->aorel))
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                                errmsg("function not supported 
on non append-optimized relation")));
diff --git a/src/backend/access/appendonly/appendonly_compaction.c 
b/src/backend/access/appendonly/appendonly_compaction.c
index 3e152db942..adebb3fdf7 100644
--- a/src/backend/access/appendonly/appendonly_compaction.c
+++ b/src/backend/access/appendonly/appendonly_compaction.c
@@ -143,7 +143,7 @@ AppendOnlyCompaction_ShouldCompact(Relation aoRelation,
     Oid         visimaprelid;
     Oid         visimapidxid;
 
-       Assert(RelationIsAppendOptimized(aoRelation));
+       Assert(RelationStorageIsAO(aoRelation));
     GetAppendOnlyEntryAuxOids(aoRelation,
                               NULL, NULL, NULL,
                               &visimaprelid, &visimapidxid);
@@ -561,7 +561,7 @@ AppendOptimizedCollectDeadSegments(Relation aorel)
        Oid                     segrelid;
        Bitmapset       *dead_segs = NULL;
 
-       Assert(RelationIsAppendOptimized(aorel));
+       Assert(RelationStorageIsAO(aorel));
 
        GetAppendOnlyEntryAuxOids(aorel,
                                                          &segrelid, NULL, 
NULL, NULL, NULL);
@@ -714,7 +714,7 @@ AppendOptimizedTruncateToEOF(Relation aorel, 
AOVacuumRelStats *vacrelstats)
        Snapshot        appendOnlyMetaDataSnapshot = 
RegisterSnapshot(GetCatalogSnapshot(InvalidOid));
        Oid                     segrelid;
 
-       Assert(RelationIsAppendOptimized(aorel));
+       Assert(RelationStorageIsAO(aorel));
 
        relname = RelationGetRelationName(aorel);
 
diff --git a/src/backend/access/appendonly/appendonly_visimap_udf.c 
b/src/backend/access/appendonly/appendonly_visimap_udf.c
index 0b4210ee93..7d405ec859 100644
--- a/src/backend/access/appendonly/appendonly_visimap_udf.c
+++ b/src/backend/access/appendonly/appendonly_visimap_udf.c
@@ -82,7 +82,7 @@ gp_aovisimap(PG_FUNCTION_ARGS)
                context = (Context *) palloc0(sizeof(Context));
 
                context->aorel = table_open(aoRelOid, AccessShareLock);
-               if (!RelationIsAppendOptimized(context->aorel))
+               if (!RelationStorageIsAO(context->aorel))
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                         errmsg("function not supported on 
relation")));
@@ -197,7 +197,7 @@ gp_aovisimap_hidden_info(PG_FUNCTION_ARGS)
                context = (Context *) palloc0(sizeof(Context));
 
                context->parentRelation = table_open(aoRelOid, AccessShareLock);
-               if (!RelationIsAppendOptimized(context->parentRelation))
+               if (!RelationStorageIsAO(context->parentRelation))
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                         errmsg("function not supported on 
relation")));
@@ -377,7 +377,7 @@ gp_aovisimap_entry(PG_FUNCTION_ARGS)
                context = (Context *) palloc0(sizeof(Context));
 
                context->parentRelation = table_open(aoRelOid, AccessShareLock);
-               if (!RelationIsAppendOptimized(context->parentRelation))
+               if (!RelationStorageIsAO(context->parentRelation))
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                         errmsg("function not supported on 
relation")));
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index b191c1b03c..60ab2a4a33 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -868,7 +868,7 @@ brinbuild(Relation heap, Relation index, IndexInfo 
*indexInfo)
        BlockNumber pagesPerRange;
        bool            isAo;
 
-       isAo = RelationIsAppendOptimized(heap);
+       isAo = RelationStorageIsAO(heap);
        /*
         * We expect to be called exactly once for any index relation.
         */
@@ -886,7 +886,7 @@ brinbuild(Relation heap, Relation index, IndexInfo 
*indexInfo)
        LockBuffer(meta, BUFFER_LOCK_EXCLUSIVE);
 
        brin_metapage_init(BufferGetPage(meta), BrinGetPagesPerRange(index),
-                                          BRIN_CURRENT_VERSION, 
RelationIsAppendOptimized(heap));
+                                          BRIN_CURRENT_VERSION, 
RelationStorageIsAO(heap));
        MarkBufferDirty(meta);
 
        if (RelationNeedsWAL(index))
@@ -1107,7 +1107,7 @@ brin_summarize_range_internal(PG_FUNCTION_ARGS)
                SetUserIdAndSecContext(heapRel->rd_rel->relowner,
                                                           save_sec_context | 
SECURITY_RESTRICTED_OPERATION);
                save_nestlevel = NewGUCNestLevel();
-               if (RelationIsAppendOptimized(heapRel) && heapBlk64 != 
BRIN_ALL_BLOCKRANGES)
+               if (RelationStorageIsAO(heapRel) && heapBlk64 != 
BRIN_ALL_BLOCKRANGES)
                {
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1463,7 +1463,7 @@ summarize_range(IndexInfo *indexInfo, BrinBuildState 
*state, Relation heapRel,
                 * Fortunately, this should occur infrequently.
                 */
 
-               if (endblknum != heapNumBlks && 
RelationIsAppendOptimized(heapRel))
+               if (endblknum != heapNumBlks && RelationStorageIsAO(heapRel))
                {
                        /*
                         * GPDB: We bail and don't summarize the final partial 
range if we
diff --git a/src/backend/catalog/aoblkdir.c b/src/backend/catalog/aoblkdir.c
index bb64961d10..fb8be31d6c 100644
--- a/src/backend/catalog/aoblkdir.c
+++ b/src/backend/catalog/aoblkdir.c
@@ -46,7 +46,7 @@ AlterTableCreateAoBlkdirTable(Oid relOid)
         * Check if this is an appendoptimized table, without acquiring any 
lock.
         */
        rel = table_open(relOid, NoLock);
-       isAO = RelationIsAppendOptimized(rel);
+       isAO = RelationStorageIsAO(rel);
        table_close(rel, NoLock);
        if (!isAO)
                return;
diff --git a/src/backend/catalog/aocatalog.c b/src/backend/catalog/aocatalog.c
index 78ea25b7ef..2fbf6c050c 100644
--- a/src/backend/catalog/aocatalog.c
+++ b/src/backend/catalog/aocatalog.c
@@ -60,7 +60,7 @@ CreateAOAuxiliaryTable(
        Oid                     namespaceid;
 
        Assert(RelationIsValid(rel));
-       Assert(RelationIsAppendOptimized(rel));
+       Assert(RelationStorageIsAO(rel));
        Assert(auxiliaryNamePrefix);
        Assert(tupledesc);
        if (relkind != RELKIND_AOSEGMENTS)
diff --git a/src/backend/catalog/aovisimap.c b/src/backend/catalog/aovisimap.c
index 8b21798c5d..a97f4cc8b1 100644
--- a/src/backend/catalog/aovisimap.c
+++ b/src/backend/catalog/aovisimap.c
@@ -45,7 +45,7 @@ AlterTableCreateAoVisimapTable(Oid relOid)
         */
        rel = table_open(relOid, AccessExclusiveLock);
 
-       if (!RelationIsAppendOptimized(rel))
+       if (!RelationStorageIsAO(rel))
        {
                table_close(rel, NoLock);
                return;
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index b983b03be5..ed592c56f6 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -523,7 +523,7 @@ heap_create(const char *relname,
                 * AO tables don't use the buffer manager, better to not keep 
the
                 * smgr open for it.
                 */
-               if (RelationIsAppendOptimized(rel))
+               if (RelationStorageIsAO(rel))
                        RelationCloseSmgr(rel);
        }
 
@@ -1780,7 +1780,7 @@ heap_create_with_catalog(const char *relname,
        /*
         * If this is an append-only relation, add an entry in pg_appendonly.
         */
-       if (RelationIsAppendOptimized(new_rel_desc))
+       if (RelationStorageIsAO(new_rel_desc))
        {
                StdRdOptions *stdRdOptions = (StdRdOptions 
*)default_reloptions(reloptions,
                                                                                
                                                         !valid_opts,
@@ -2447,7 +2447,7 @@ heap_drop_with_catalog(Oid relid)
         */
        rel = relation_open(relid, AccessExclusiveLock);
 
-       is_appendonly_rel = RelationIsAppendOptimized(rel);
+       is_appendonly_rel = RelationStorageIsAO(rel);
 
        /*
         * There can no longer be anyone *else* touching the relation, but we
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1a2abbc53e..eea39c54a9 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -3046,7 +3046,7 @@ index_update_stats(Relation rel,
                 * GPDB: In theory, it is possible to support index only scans 
with AO
                 * tables, but disable them for now by setting relallvisible to 
0.
                 */
-               if (rd_rel->relkind != RELKIND_INDEX && 
!RelationIsAppendOptimized(rel))
+               if (rd_rel->relkind != RELKIND_INDEX && 
!RelationStorageIsAO(rel))
                        visibilitymap_count(rel, &relallvisible, NULL);
                else                                    /* don't bother for 
indexes */
                        relallvisible = 0;
@@ -4134,7 +4134,7 @@ reindex_relation(Oid relid, int flags, ReindexParams 
*params)
                         get_namespace_name(RelationGetNamespace(rel)),
                         RelationGetRelationName(rel));
 
-       relIsAO = RelationIsAppendOptimized(rel);
+       relIsAO = RelationStorageIsAO(rel);
 
        toast_relid = rel->rd_rel->reltoastrelid;
 
diff --git a/src/backend/catalog/pg_appendonly.c 
b/src/backend/catalog/pg_appendonly.c
index 55df4cc6fd..1f51d8a625 100644
--- a/src/backend/catalog/pg_appendonly.c
+++ b/src/backend/catalog/pg_appendonly.c
@@ -196,7 +196,7 @@ GetAppendOnlyEntryAuxOids(Relation rel,
        Form_pg_appendonly      aoForm;
 
        /* the relation has to be a non-partitioned AO/CO table */
-       Assert(RelationIsAppendOptimized(rel));
+       Assert(RelationStorageIsAO(rel));
 
        aoForm = rel->rd_appendonly;
 
@@ -228,7 +228,7 @@ GetAppendOnlyEntry(Relation rel, Form_pg_appendonly aoEntry)
        Form_pg_appendonly      aoForm;
 
        /* the relation has to be a non-partitioned AO/CO table and the aoEntry 
is valid */
-       Assert(RelationIsAppendOptimized(rel));
+       Assert(RelationStorageIsAO(rel));
        Assert(aoEntry);
 
        aoForm = rel->rd_appendonly;
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index ee1975cc2f..1216e90186 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -1077,7 +1077,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
        {
                BlockNumber relallvisible;
 
-               if (RelationIsAppendOptimized(onerel))
+               if (RelationStorageIsAO(onerel))
                        relallvisible = 0;
                else
                        relallvisible = AcquireNumberOfAllVisibleBlocks(onerel);
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index 2428a74a6a..c194336b85 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -677,6 +677,8 @@ rebuild_relation(Relation OldHeap, Oid indexOid, bool 
verbose)
         */
        bool            is_ao = RelationIsAppendOptimized(OldHeap);
 
+    bool               is_ao = RelationStorageIsAO(OldHeap);
+
        /* Mark the correct index as clustered */
        if (OidIsValid(indexOid))
                mark_index_clustered(OldHeap, indexOid, true);
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 61c54ab501..cb40ea7f48 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -821,7 +821,7 @@ DefineIndex(Oid relationId,
         * we can use the same lock as heap tables.
         */
        rel = table_open(relationId, NoLock);
-       if (RelationIsAppendOptimized(rel))
+       if (RelationStorageIsAO(rel))
        {
                GetAppendOnlyEntryAuxOids(rel, NULL, &blkdirrelid, NULL, NULL, 
NULL);
 
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 39c1e7a1cb..f31ffd454e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -1289,7 +1289,11 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid 
ownerId,
        /*
         * If this is an append-only relation, create the auxliary tables 
necessary
         */
+<<<<<<< HEAD
        if (RelationIsAppendOptimized(rel))
+=======
+       if (RelationStorageIsAO(rel))
+>>>>>>> 0c942b968db (Refactor AO macro RelationIsAppendOptimized (#15546))
                NewRelationCreateAOAuxTables(RelationGetRelid(rel), 
stmt->buildAoBlkdir);
 
        /*
@@ -2010,7 +2014,7 @@ relid_set_new_relfilenode(Oid relid)
 static void
 ao_aux_tables_safe_truncate(Relation rel)
 {
-       if (!RelationIsAppendOptimized(rel))
+       if (!RelationStorageIsAO(rel))
                return;
 
        Oid relid = RelationGetRelid(rel);
@@ -15692,7 +15696,7 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool 
recursing, LOCKMODE lock
                        ATExecChangeOwner(tuple_class->reltoastrelid, 
newOwnerId,
                                                          true, lockmode);
 
-               if (RelationIsAppendOptimized(target_rel))
+               if (RelationStorageIsAO(target_rel))
                {
                        Oid segrelid, blkdirrelid;
                        Oid visimap_relid;
@@ -16323,7 +16327,7 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, 
LOCKMODE lockmode)
        }
 
        /* Get the ao sub objects */
-       if (RelationIsAppendOptimized(rel))
+       if (RelationStorageIsAO(rel))
                GetAppendOnlyEntryAuxOids(rel,
                                                                  
&relaosegrelid,
                                                                  
&relaoblkdirrelid, &relaoblkdiridxid,
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 47d203d12c..335a28aa42 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -1701,6 +1701,7 @@ vac_update_relstats(Relation relation,
                {
                        Assert(Gp_role == GP_ROLE_UTILITY);
                        Assert(!IsSystemRelation(relation));
+                       Assert(RelationStorageIsAO(relation));
                        num_tuples = 0;
                }
 
@@ -2514,7 +2515,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams 
*params,
        else
                toast_relid = InvalidOid;
 
-       if (RelationIsAppendOptimized(rel))
+       if (RelationStorageIsAO(rel))
        {
                /*
                 * GPDB: AO tables should never be passed into vacuum_rel if the
@@ -2610,7 +2611,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams 
*params,
                return false;
        }
 
-       is_appendoptimized = RelationIsAppendOptimized(rel);
+       is_appendoptimized = RelationStorageIsAO(rel);
        is_toast = (rel->rd_rel->relkind == RELKIND_TOASTVALUE);
 
        if (ao_vacuum_phase && !(is_appendoptimized || is_toast))
diff --git a/src/backend/commands/vacuum_ao.c b/src/backend/commands/vacuum_ao.c
index b9f1fef145..c2bb875612 100644
--- a/src/backend/commands/vacuum_ao.c
+++ b/src/backend/commands/vacuum_ao.c
@@ -434,7 +434,7 @@ void
 ao_vacuum_rel(Relation rel, VacuumParams *params, BufferAccessStrategy 
bstrategy)
 {
        static AOVacuumRelStats *vacrelstats = NULL;
-       Assert(RelationIsAppendOptimized(rel));
+       Assert(RelationStorageIsAO(rel));
        Assert(params != NULL);
 
        int ao_vacuum_phase = (params->options & VACUUM_AO_PHASE_MASK);
@@ -539,7 +539,7 @@ vacuum_appendonly_indexes(Relation aoRelation, int options, 
Bitmapset *dead_segs
        Relation   *Irel;
        int                     nindexes;
 
-       Assert(RelationIsAppendOptimized(aoRelation));
+       Assert(RelationStorageIsAO(aoRelation));
 
        if (Debug_appendonly_print_compaction)
                elog(LOG, "Vacuum indexes for append-only relation %s",
diff --git a/src/backend/executor/nodeBitmapHeapscan.c 
b/src/backend/executor/nodeBitmapHeapscan.c
index 2993b2580e..f2ea9c4c18 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -877,7 +877,7 @@ ExecInitBitmapHeapScanForPartition(BitmapHeapScan *node, 
EState *estate, int efl
                
get_tablespace_io_concurrency(currentRelation->rd_rel->reltablespace);
 
        /* Prefetching hasn't been implemented for AO tables */
-       if (RelationIsAppendOptimized(currentRelation))
+       if (RelationStorageIsAO(currentRelation))
                scanstate->prefetch_maximum = 0;
 
        scanstate->ss.ss_currentRelation = currentRelation;
diff --git a/src/backend/parser/parse_utilcmd.c 
b/src/backend/parser/parse_utilcmd.c
index e0007c6636..2b72b7aa88 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -1284,7 +1284,7 @@ transformTableLikeClause(CreateStmtContext *cxt, 
TableLikeClause *table_like_cla
                 */
                oldcontext = MemoryContextSwitchTo(CurTransactionContext);
 
-               if (RelationIsAppendOptimized(relation))
+               if (RelationStorageIsAO(relation))
                {
                        int32 blocksize;
                        int32 safefswritersize;
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index 269ff8724b..b98dfe20ed 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -642,7 +642,7 @@ calculate_table_size(Relation rel)
        if (OidIsValid(rel->rd_rel->reltoastrelid))
                size += calculate_toast_table_size(rel->rd_rel->reltoastrelid);
 
-       if (RelationIsAppendOptimized(rel))
+       if (RelationStorageIsAO(rel))
        {
                Oid     auxRelIds[3];
                GetAppendOnlyEntryAuxOids(rel, &auxRelIds[0],
diff --git a/src/backend/utils/cache/relcache.c 
b/src/backend/utils/cache/relcache.c
index 30532663b4..c38e311175 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -1266,7 +1266,7 @@ retry:
        /*
         * If it's an append-only table, get information from pg_appendonly.
         */
-       if (RelationIsAppendOptimized(relation))
+       if (RelationStorageIsAO(relation))
                RelationInitAppendOnlyInfo(relation);
 
        /* extract reloptions if any */
@@ -1894,7 +1894,7 @@ RelationInitTableAccessMethod(Relation relation)
                 * Cloudberry: append-optimized relations should not have a 
valid
                 * relfrozenxid.
                 */
-               Assert (!RelationIsAppendOptimized(relation) ||
+               Assert (!RelationStorageIsAO(relation) ||
                                
!TransactionIdIsValid(relation->rd_rel->relfrozenxid));
        }
 
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 3c753895f7..48ac75f20f 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -528,6 +528,10 @@ typedef struct ViewOptions
 #define RelationIsAppendOptimized(relation) \
        AMHandlerIsAO((relation)->rd_amhandler)
 
+#define RelationStorageIsAO(relation) \
+       ((RelationIsAoRows(relation) || RelationIsAoCols(relation)) && \
+               relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
+
 /*
  * FIXME: CBDB should not know the am oid of PAX. We put here because the 
kernel
  * can't distinguish the PAX and renamed heap(heap_psql) in test `psql`.
@@ -648,7 +652,7 @@ typedef struct ViewOptions
                        smgrsetowner(&((relation)->rd_smgr), \
                                                 smgropen((relation)->rd_node, \
                                                                  
(relation)->rd_backend, \
-                                                                 
RelationIsAppendOptimized(relation)?SMGR_AO:SMGR_MD, relation)); \
+                                                                 
RelationStorageIsAO(relation)?SMGR_AO:SMGR_MD, relation)); \
        } while (0)
 
 /*
diff --git a/src/test/isolation2/expected/lockmodes.out 
b/src/test/isolation2/expected/lockmodes.out
index df566ff9cd..b99e71c9ab 100644
--- a/src/test/isolation2/expected/lockmodes.out
+++ b/src/test/isolation2/expected/lockmodes.out
@@ -2182,6 +2182,111 @@ UPDATE 1
 ROLLBACK
 1q: ... <quitting>
 
+<<<<<<< HEAD
+=======
+1: BEGIN;
+BEGIN
+1: INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM 
generate_series(1,10)i;
+INSERT 10
+-- With GDD enabled, QD will only hold lock on root for insert
+1: select * from show_locks_lockmodes;
+ locktype | mode             | granted | relation                
+----------+------------------+---------+-------------------------
+ relation | RowExclusiveLock | t       | t_lockmods_part_tbl_dml 
+(1 row)
+1: ROLLBACK;
+ROLLBACK
+1q: ... <quitting>
+
+1: CREATE TABLE t_lockmods_aopart(i int, t text) USING ao_row PARTITION BY 
RANGE(i) (START(1) END(5) EVERY(1));
+CREATE
+1: BEGIN;
+BEGIN
+1: DELETE FROM t_lockmods_aopart WHERE i = 4;
+DELETE 0
+-- With GDD enabled, QD will only hold lock on root for delete
+1: select * from show_locks_lockmodes;
+ locktype | mode            | granted | relation                  
+----------+-----------------+---------+---------------------------
+ relation | ExclusiveLock   | t       | t_lockmods_aopart_1_prt_4 
+ relation | AccessShareLock | t       | t_lockmods_aopart         
+ relation | ExclusiveLock   | t       | t_lockmods_aopart         
+(3 rows)
+1: COMMIT;
+COMMIT
+1: DROP TABLE t_lockmods_aopart;
+DROP
+1q: ... <quitting>
+
+-- 2.8 Verify behaviors of select with locking clause (i.e. select for update)
+-- when running concurrently with index creation, for Heap tables.
+-- For AO/CO tables, refer to create_index_allows_readonly.source.
+
+1: CREATE TABLE create_index_select_for_update_tbl(a int, b int);
+CREATE
+1: INSERT INTO create_index_select_for_update_tbl SELECT i,i FROM 
generate_series(1,10)i;
+INSERT 10
+1: set optimizer = off;
+SET
+
+-- 2.8.1 with GDD enabled, expect no blocking
+1: show gp_enable_global_deadlock_detector;
+ gp_enable_global_deadlock_detector 
+------------------------------------
+ on                                 
+(1 row)
+
+1: BEGIN;
+BEGIN
+1: SELECT * FROM create_index_select_for_update_tbl WHERE a = 2 FOR UPDATE;
+ a | b 
+---+---
+ 2 | 2 
+(1 row)
+
+2: set optimizer = off;
+SET
+
+2: BEGIN;
+BEGIN
+-- expect no blocking
+2: CREATE INDEX create_index_select_for_update_idx ON 
create_index_select_for_update_tbl(a);
+CREATE
+2: COMMIT;
+COMMIT
+
+1: COMMIT;
+COMMIT
+
+2: DROP INDEX create_index_select_for_update_idx;
+DROP
+
+2: BEGIN;
+BEGIN
+2: CREATE INDEX create_index_select_for_update_idx ON 
create_index_select_for_update_tbl(a);
+CREATE
+
+1: BEGIN;
+BEGIN
+-- expect no blocking
+1: SELECT * FROM create_index_select_for_update_tbl WHERE a = 2 FOR UPDATE;
+ a | b 
+---+---
+ 2 | 2 
+(1 row)
+1: COMMIT;
+COMMIT
+-- close session to avoid renew session failure after restart
+1q: ... <quitting>
+
+2: COMMIT;
+COMMIT
+
+2: DROP INDEX create_index_select_for_update_idx;
+DROP
+
+-- 2.8.2 with GDD disabled, expect blocking
+>>>>>>> 0c942b968db (Refactor AO macro RelationIsAppendOptimized (#15546))
 -- reset gdd
 2: ALTER SYSTEM RESET gp_enable_global_deadlock_detector;
 ALTER


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to