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

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

commit 130a7b2ec1fd92ad65471318db3ccfc142b95b30
Author: Ashwin Agrawal <[email protected]>
AuthorDate: Mon Feb 27 10:59:29 2023 -0800

    Remove fixme from appendonly_index_validate_scan()
    
    Concurrent index builds are not supported in GPDB. The currently
    implemented code in this function is all heap centric and not really
    AO. Hence, deleting the function implementation and adding ERROR if
    called. When we get to implement the feature of CONCURRENT index
    builds then can properly implement the interface.
---
 .../access/appendonly/appendonlyam_handler.c       | 224 +--------------------
 1 file changed, 7 insertions(+), 217 deletions(-)

diff --git a/src/backend/access/appendonly/appendonlyam_handler.c 
b/src/backend/access/appendonly/appendonlyam_handler.c
index a80e06f73d..aff85e68c5 100644
--- a/src/backend/access/appendonly/appendonlyam_handler.c
+++ b/src/backend/access/appendonly/appendonlyam_handler.c
@@ -1809,226 +1809,16 @@ appendonly_index_validate_scan(Relation heapRelation,
                                                   Snapshot snapshot,
                                                   ValidateIndexState *state)
 {
-       TableScanDesc scan;
-       AppendOnlyScanDesc aoscan;
-       HeapTuple       heapTuple;
-       Datum           values[INDEX_MAX_KEYS];
-       bool            isnull[INDEX_MAX_KEYS];
-       ExprState  *predicate;
-       TupleTableSlot *slot;
-       EState     *estate;
-       ExprContext *econtext;
-       BlockNumber root_blkno = InvalidBlockNumber;
-#if 0
-       OffsetNumber root_offsets[MaxHeapTuplesPerPage];
-#endif
-       bool            in_index[MaxHeapTuplesPerPage];
-
-       /* state variables for the merge */
-       ItemPointer indexcursor = NULL;
-       ItemPointerData decoded;
-       bool            tuplesort_empty = false;
-
-       /*
-        * sanity checks
-        */
-       Assert(OidIsValid(indexRelation->rd_rel->relam));
-
-       /*
-        * Need an EState for evaluation of index expressions and partial-index
-        * predicates.  Also a slot to hold the current tuple.
-        */
-       estate = CreateExecutorState();
-       econtext = GetPerTupleExprContext(estate);
-       slot = table_slot_create(heapRelation, NULL);
-
-       /* Arrange for econtext's scan tuple to be the tuple under test */
-       econtext->ecxt_scantuple = slot;
-
-       /* Set up execution state for predicate, if any. */
-       predicate = ExecPrepareQual(indexInfo->ii_Predicate, estate);
-
        /*
-        * Prepare for scan of the base relation.  We need just those tuples
-        * satisfying the passed-in reference snapshot.  We must disable 
syncscan
-        * here, because it's critical that we read from block zero forward to
-        * match the sorted TIDs.
+        * This interface is used during CONCURRENT INDEX builds. Currently,
+        * CONCURRENT INDEX builds are not supported in GPDB. This function 
should
+        * not have been called in the first place, but if it is called, better 
to
+        * error out.
         */
-       scan = table_beginscan_strat(heapRelation,      /* relation */
-                                                                snapshot,      
/* snapshot */
-                                                                0, /* number 
of keys */
-                                                                NULL,  /* scan 
key */
-                                                                true,  /* 
buffer access strategy OK */
-                                                                false);        
/* syncscan not OK */
-       aoscan = (AppendOnlyScanDesc) scan;
-
-       /* GPDB_12_MERGE_FIXME */
-#if 0
-       pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_TOTAL,
-                                                                
aoscan->rs_nblocks);
-#endif
-
-       /*
-        * Scan all tuples matching the snapshot.
-        */
-       while ((heapTuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
-       {
-               ItemPointer heapcursor = &heapTuple->t_self;
-               ItemPointerData rootTuple;
-               OffsetNumber root_offnum;
-
-               CHECK_FOR_INTERRUPTS();
-
-               state->htups += 1;
-
-       /* GPDB_12_MERGE_FIXME */
-#if 0
-               if ((previous_blkno == InvalidBlockNumber) ||
-                       (aoscan->rs_cblock != previous_blkno))
-               {
-                       pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_DONE,
-                                                                               
 aoscan->rs_cblock);
-                       previous_blkno = aoscan->rs_cblock;
-               }
-#endif
-
-               /* Convert actual tuple TID to root TID */
-               rootTuple = *heapcursor;
-               root_offnum = ItemPointerGetOffsetNumber(heapcursor);
-
-               if (HeapTupleIsHeapOnly(heapTuple))
-               {
-                       /* GPDB_12_MERGE_FIXME: root_offsets unitialized */
-#if 0
-                       root_offnum = root_offsets[root_offnum - 1];
-                       if (!OffsetNumberIsValid(root_offnum))
-                               ereport(ERROR,
-                                               
(errcode(ERRCODE_DATA_CORRUPTED),
-                                                errmsg_internal("failed to 
find parent tuple for heap-only tuple at (%u,%u) in table \"%s\"",
-                                                                               
 ItemPointerGetBlockNumber(heapcursor),
-                                                                               
 ItemPointerGetOffsetNumber(heapcursor),
-                                                                               
 RelationGetRelationName(heapRelation))));
-                       ItemPointerSetOffsetNumber(&rootTuple, root_offnum);
-#else
-                       elog(ERROR, "GPDB_12_MERGE_FIXME");
-#endif
-               }
-
-               /*
-                * "merge" by skipping through the index tuples until we find 
or pass
-                * the current root tuple.
-                */
-               while (!tuplesort_empty &&
-                          (!indexcursor ||
-                               ItemPointerCompare(indexcursor, &rootTuple) < 
0))
-               {
-                       Datum           ts_val;
-                       bool            ts_isnull;
-
-                       if (indexcursor)
-                       {
-                               /*
-                                * Remember index items seen earlier on the 
current heap page
-                                */
-                               if (ItemPointerGetBlockNumber(indexcursor) == 
root_blkno)
-                                       
in_index[ItemPointerGetOffsetNumber(indexcursor) - 1] = true;
-                       }
-
-                       tuplesort_empty = !tuplesort_getdatum(state->tuplesort, 
true,
-                                                                               
                  &ts_val, &ts_isnull, NULL);
-                       Assert(tuplesort_empty || !ts_isnull);
-                       if (!tuplesort_empty)
-                       {
-                               itemptr_decode(&decoded, DatumGetInt64(ts_val));
-                               indexcursor = &decoded;
-
-                               /* If int8 is pass-by-ref, free (encoded) TID 
Datum memory */
-#ifndef USE_FLOAT8_BYVAL
-                               pfree(DatumGetPointer(ts_val));
-#endif
-                       }
-                       else
-                       {
-                               /* Be tidy */
-                               indexcursor = NULL;
-                       }
-               }
-
-               /*
-                * If the tuplesort has overshot *and* we didn't see a match 
earlier,
-                * then this tuple is missing from the index, so insert it.
-                */
-               if ((tuplesort_empty ||
-                        ItemPointerCompare(indexcursor, &rootTuple) > 0) &&
-                       !in_index[root_offnum - 1])
-               {
-                       MemoryContextReset(econtext->ecxt_per_tuple_memory);
-
-                       /* Set up for predicate or expression evaluation */
-                       ExecStoreHeapTuple(heapTuple, slot, false);
-
-                       /*
-                        * In a partial index, discard tuples that don't 
satisfy the
-                        * predicate.
-                        */
-                       if (predicate != NULL)
-                       {
-                               if (!ExecQual(predicate, econtext))
-                                       continue;
-                       }
-
-                       /*
-                        * For the current heap tuple, extract all the 
attributes we use
-                        * in this index, and note which are null.  This also 
performs
-                        * evaluation of any expressions needed.
-                        */
-                       FormIndexDatum(indexInfo,
-                                                  slot,
-                                                  estate,
-                                                  values,
-                                                  isnull);
-
-                       /*
-                        * You'd think we should go ahead and build the index 
tuple here,
-                        * but some index AMs want to do further processing on 
the data
-                        * first. So pass the values[] and isnull[] arrays, 
instead.
-                        */
-
-                       /*
-                        * If the tuple is already committed dead, you might 
think we
-                        * could suppress uniqueness checking, but this is no 
longer true
-                        * in the presence of HOT, because the insert is 
actually a proxy
-                        * for a uniqueness check on the whole HOT-chain.  That 
is, the
-                        * tuple we have here could be dead because it was 
already
-                        * HOT-updated, and if so the updating transaction will 
not have
-                        * thought it should insert index entries.  The index 
AM will
-                        * check the whole HOT-chain and correctly detect a 
conflict if
-                        * there is one.
-                        */
-
-                       index_insert(indexRelation,
-                                                values,
-                                                isnull,
-                                                &rootTuple,
-                                                heapRelation,
-                                                indexInfo->ii_Unique ?
-                                                UNIQUE_CHECK_YES : 
UNIQUE_CHECK_NO,
-                                                false,
-                                                indexInfo);
-
-                       state->tups_inserted += 1;
-               }
-       }
-
-       table_endscan(scan);
-
-       ExecDropSingleTupleTableSlot(slot);
-
-       FreeExecutorState(estate);
+       ereport(ERROR,
+                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                        errmsg("index validate scan - feature not supported on 
appendoptimized relations")));
 
-       /* These may have been pointing to the now-gone estate */
-       indexInfo->ii_ExpressionsState = NIL;
-       indexInfo->ii_PredicateState = NULL;
 }
 
 /* ------------------------------------------------------------------------


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

Reply via email to