diff --git a/src/backend/access/aocs/aocsam.c b/src/backend/access/aocs/aocsam.c index fa8670a5fea2ed90b94c5baebf9353b401ff9f6b..059617f8fd0c2b4b042eef462a6a0475a512881e 100644 --- a/src/backend/access/aocs/aocsam.c +++ b/src/backend/access/aocs/aocsam.c @@ -1233,7 +1233,8 @@ aocs_fetch_init(Relation relation, aocsFetchDesc->totalSegfiles, aocsFetchDesc->relation, relation->rd_att->natts, - true); + true, + proj); Assert(relation->rd_att != NULL); diff --git a/src/backend/access/appendonly/appendonlyam.c b/src/backend/access/appendonly/appendonlyam.c index eedaf2c03e67d82f7ed24366a597d0db4292c275..ac210697c6669bb4543ee9bdbd3cb576ac15a651 100755 --- a/src/backend/access/appendonly/appendonlyam.c +++ b/src/backend/access/appendonly/appendonlyam.c @@ -2235,7 +2235,8 @@ appendonly_fetch_init( aoFetchDesc->totalSegfiles, aoFetchDesc->relation, 1, - false); + false, + NULL); AppendOnlyVisimap_Init(&aoFetchDesc->visibilityMap, aoentry->visimaprelid, diff --git a/src/backend/access/appendonly/appendonlyblockdirectory.c b/src/backend/access/appendonly/appendonlyblockdirectory.c index c28092e1f1afb3b04b6b2cad9145cb33347be7fb..f05e239497c191cee69463958c6e8a191a0604ca 100644 --- a/src/backend/access/appendonly/appendonlyblockdirectory.c +++ b/src/backend/access/appendonly/appendonlyblockdirectory.c @@ -141,8 +141,13 @@ init_internal(AppendOnlyBlockDirectory *blockDirectory) palloc0(sizeof(MinipagePerColumnGroup) * blockDirectory->numColumnGroups); for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) { - MinipagePerColumnGroup *minipageInfo = &blockDirectory->minipages[groupNo]; - + if (blockDirectory->proj && !blockDirectory->proj[groupNo]) + { + /* Ignore columns that are not projected. */ + continue; + } + MinipagePerColumnGroup *minipageInfo = + &blockDirectory->minipages[groupNo]; minipageInfo->minipage = palloc0(minipage_size(NUM_MINIPAGE_ENTRIES)); minipageInfo->numMinipageEntries = 0; @@ -169,8 +174,9 @@ AppendOnlyBlockDirectory_Init_forSearch( int totalSegfiles, Relation aoRel, int numColumnGroups, - bool isAOCol) -{ + bool isAOCol, + bool *proj) +{ Assert(aoEntry != NULL); blockDirectory->aoRel = aoRel; @@ -196,6 +202,7 @@ AppendOnlyBlockDirectory_Init_forSearch( blockDirectory->appendOnlyMetaDataSnapshot = appendOnlyMetaDataSnapshot; blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->isAOCol = isAOCol; + blockDirectory->proj = proj; blockDirectory->currentSegmentFileNum = -1; Assert(OidIsValid(aoEntry->blkdirrelid)); @@ -255,7 +262,8 @@ AppendOnlyBlockDirectory_Init_forInsert( blockDirectory->currentSegmentFileNum = segno; blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->isAOCol = isAOCol; - + blockDirectory->proj = NULL; + Assert(OidIsValid(aoEntry->blkdirrelid)); blockDirectory->blkdirRel = @@ -319,7 +327,8 @@ AppendOnlyBlockDirectory_Init_addCol( blockDirectory->currentSegmentFileNum = segno; blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->isAOCol = isAOCol; - + blockDirectory->proj = NULL; + Assert(OidIsValid(aoEntry->blkdirrelid)); /* @@ -560,6 +569,11 @@ AppendOnlyBlockDirectory_GetEntry( for (tmpGroupNo = 0; tmpGroupNo < blockDirectory->numColumnGroups; tmpGroupNo++) { + if (blockDirectory->proj && !blockDirectory->proj[tmpGroupNo]) + { + /* Ignore columns that are not projected. */ + continue; + } /* Setup the scan keys for the scan. */ Assert(scanKeys != NULL); scanKeys[0].sk_argument = Int32GetDatum(segmentFileNum); @@ -1258,7 +1272,8 @@ AppendOnlyBlockDirectory_End_forSearch( for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) { - pfree(blockDirectory->minipages[groupNo].minipage); + if (blockDirectory->minipages[groupNo].minipage != NULL) + pfree(blockDirectory->minipages[groupNo].minipage); } ereportif(Debug_appendonly_print_blockdirectory, LOG, diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 9395e9550c21c55f45291bcca9ddc1fa793f0743..06f0dc93ec1423c2a9200c17f534a48086640ab3 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -2143,7 +2143,8 @@ vacuum_appendonly_indexes(Relation aoRelation, totalSegfiles, aoRelation, 1, - RelationIsAoCols(aoRelation)); + RelationIsAoCols(aoRelation), + NULL); /* Clean/scan index relation(s) */ if (Irel != NULL) diff --git a/src/include/cdb/cdbappendonlyblockdirectory.h b/src/include/cdb/cdbappendonlyblockdirectory.h index 9482ec8ddba361aa2e073ab883d2bb821e16e2e7..7f432e78475e846664d8c6dcd9f7fe65b71d37a9 100644 --- a/src/include/cdb/cdbappendonlyblockdirectory.h +++ b/src/include/cdb/cdbappendonlyblockdirectory.h @@ -90,7 +90,8 @@ typedef struct AppendOnlyBlockDirectory Relation blkdirIdx; int numColumnGroups; bool isAOCol; - + bool *proj; /* projected columns, used only if isAOCol = TRUE */ + MemoryContext memoryContext; int totalSegfiles; @@ -182,7 +183,8 @@ extern void AppendOnlyBlockDirectory_Init_forSearch( int totalSegfiles, Relation aoRel, int numColumnGroups, - bool isAOCol); + bool isAOCol, + bool *proj); extern void AppendOnlyBlockDirectory_Init_addCol( AppendOnlyBlockDirectory *blockDirectory, AppendOnlyEntry *aoEntry, diff --git a/src/test/regress/input/aocs.source b/src/test/regress/input/aocs.source index 02fa6c9b2878a3c109d2619d6ee7f879d5cc9dfd..bd50abbbf954cec38e6b3a2eaa6ebdfa79575a2c 100644 --- a/src/test/regress/input/aocs.source +++ b/src/test/regress/input/aocs.source @@ -283,7 +283,11 @@ select * from co where j = 2; insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'), (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); select * from co where j = 2; - +-- Select specific columns. This covers the case when block directory +-- entries for only specific columns need to be loaded during index +-- scan. +select i from co where j = 2; +select j,i from co where k = 'aaa' or k = 'bbb'; --------------------- -- UAO diff --git a/src/test/regress/output/aocs.source b/src/test/regress/output/aocs.source index 54c27ccb7b0503e9c722405f64db5058c3e8232b..576e06df79a099f6424164386622a09b541f4fa9 100644 --- a/src/test/regress/output/aocs.source +++ b/src/test/regress/output/aocs.source @@ -544,6 +544,28 @@ select * from co where j = 2; 11 | 2 | bbb (6 rows) +-- Select specific columns. This covers the case when block directory +-- entries for only specific columns need to be loaded during index +-- scan. +select i from co where j = 2; + i +---- + 9 + 11 + 2 + 10 + 10 + 12 +(6 rows) + +select j,i from co where k = 'aaa' or k = 'bbb'; + j | i +---+---- + 3 | 3 + 3 | 11 + 2 | 11 +(3 rows) + --------------------- -- UAO ---------------------