From 8191e214c64309ba1b3106b414f9ffc6a57e0702 Mon Sep 17 00:00:00 2001 From: openGaussDev Date: Fri, 4 Mar 2022 10:25:48 +0800 Subject: [PATCH] fixbug Offering: openGaussDev More detail: fixbug toast update Match-id-e1c8f8cebd825f9509c89dc60e25d62af8a06474 --- src/gausskernel/runtime/executor/execQual.cpp | 23 +++++-------------- src/include/access/tuptoaster.h | 8 +++---- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index ccd880bda..1145c046e 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -5967,7 +5967,7 @@ int ExecCleanTargetListLength(List* targetlist) return len; } -HeapTuple get_tuple(Relation relation, ItemPointer tid) +HeapTuple get_tuple(Relation relation, ItemPointer tid, bool update_check) { Buffer user_buf = InvalidBuffer; HeapTuple tuple = NULL; @@ -5981,7 +5981,7 @@ HeapTuple get_tuple(Relation relation, ItemPointer tid) tuple->t_self = *tid; if (heap_fetch(relation, SnapshotAny, tuple, &user_buf, false, NULL)) { - result = HeapTupleSatisfiesUpdate(tuple, GetCurrentCommandId(true), user_buf, false); + result = update_check ? HeapTupleSatisfiesUpdate(tuple, GetCurrentCommandId(true), user_buf, false) : TM_Ok; if (result != TM_Ok) { ereport(ERROR, (errcode(ERRCODE_SYSTEM_ERROR), errmsg("Failed to get tuple"))); } @@ -6013,7 +6013,7 @@ Datum fetch_lob_value_from_tuple(varatt_lob_pointer* lob_pointer, Oid update_oid tuple_ctid.ip_blkid.bi_lo = lob_pointer->bi_lo; tuple_ctid.ip_posid = lob_pointer->ip_posid; Relation relation = heap_open(lob_pointer->relid, RowExclusiveLock); - HeapTuple origin_tuple = get_tuple(relation, &tuple_ctid); + HeapTuple origin_tuple = get_tuple(relation, &tuple_ctid, false); if (!HeapTupleIsValid(origin_tuple)) { ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), @@ -6113,20 +6113,9 @@ static bool ExecTargetList(List* targetlist, ExprContext* econtext, Datum* value if (VARATT_IS_EXTERNAL_LOB(values[resind])) { struct varatt_lob_pointer* lob_pointer = (varatt_lob_pointer*)(VARDATA_EXTERNAL(values[resind])); bool is_null = false; - if (econtext->ecxt_scantuple != NULL) { - Oid update_oid = ((HeapTuple)(econtext->ecxt_scantuple->tts_tuple))->t_tableOid; - values[resind] = fetch_lob_value_from_tuple(lob_pointer, update_oid, &is_null, NULL); - } else { - ItemPointerData tuple_ctid; - tuple_ctid.ip_blkid.bi_hi = lob_pointer->bi_hi; - tuple_ctid.ip_blkid.bi_lo = lob_pointer->bi_lo; - tuple_ctid.ip_posid = lob_pointer->ip_posid; - Relation relation = heap_open(lob_pointer->relid, RowExclusiveLock); - HeapTuple origin_tuple = get_tuple(relation, &tuple_ctid); - Datum attr = fastgetattr(origin_tuple, lob_pointer->columid, relation->rd_att, &is_null); - values[resind] = attr; - heap_close(relation, NoLock); - } + Oid update_oid = econtext->ecxt_scantuple != NULL ? + ((HeapTuple)(econtext->ecxt_scantuple->tts_tuple))->t_tableOid : InvalidOid; + values[resind] = fetch_lob_value_from_tuple(lob_pointer, update_oid, &is_null, NULL); isnull[resind] = is_null; } } diff --git a/src/include/access/tuptoaster.h b/src/include/access/tuptoaster.h index 01d95f3c6..e30a0823f 100644 --- a/src/include/access/tuptoaster.h +++ b/src/include/access/tuptoaster.h @@ -247,10 +247,7 @@ extern HeapTuple toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc); */ extern Datum toast_flatten_tuple_attribute(Datum value, Oid typeId, int32 typeMod); extern text* text_catenate_huge(text* t1, text* t2, Oid toastOid); -extern Oid get_toast_oid(); extern int64 calculate_huge_length(text* t); -extern Datum fetch_lob_value_from_tuple(varatt_lob_pointer* lob_pointer, Oid update_oid, - bool* is_null, bool* is_huge_clob = NULL); /* ---------- * toast_compress_datum - @@ -280,7 +277,10 @@ extern bool toastrel_valueid_exists(Relation toastrel, Oid valueid); extern varlena* toast_huge_write_datum_slice(struct varlena* attr1, struct varlena* attr2, int64 sliceoffset, int32 length); extern varlena* toast_pointer_fetch_data(TupleTableSlot* varSlot, Form_pg_attribute attr, int varNumber); -bool create_toast_by_sid(Oid *toastOid); +extern Datum fetch_lob_value_from_tuple(varatt_lob_pointer* lob_pointer, Oid update_oid, + bool* is_null, bool* is_huge_clob = NULL); +extern bool create_toast_by_sid(Oid *toastOid); +extern Oid get_toast_oid(); #endif /* TUPTOASTER_H */