diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index f2b2db06..f0e72838 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -6027,9 +6027,7 @@ Datum fetch_lob_value_from_tuple(varatt_lob_pointer* lob_pointer, Oid update_oid if (*is_null) { new_attr = (Datum)0; } else { - if (VARATT_IS_SHORT(attr) || VARATT_IS_EXTERNAL(attr) || VARATT_IS_4B(attr)) { - new_attr = PointerGetDatum(attr); - } else if (VARATT_IS_HUGE_TOAST_POINTER(attr)) { + if (VARATT_IS_HUGE_TOAST_POINTER(attr)) { if (unlikely(origin_tuple->tupTableType == UHEAP_TUPLE)) { ereport(ERROR, (errcode(ERRCODE_INVALID_NAME), @@ -6040,6 +6038,8 @@ Datum fetch_lob_value_from_tuple(varatt_lob_pointer* lob_pointer, Oid update_oid struct varlena *new_value = heap_tuple_fetch_and_copy(update_rel, old_value, false); new_attr = PointerGetDatum(new_value); heap_close(update_rel, NoLock); + } else if (VARATT_IS_SHORT(attr) || VARATT_IS_EXTERNAL(attr) || VARATT_IS_4B(attr)) { + new_attr = PointerGetDatum(attr); } else { ereport(ERROR, (errcode(ERRCODE_SYSTEM_ERROR), errmsg("lob value which fetch from tuple type is not recognized."), diff --git a/src/test/regress/sql/huge_clob.sql b/src/test/regress/sql/huge_clob.sql index b7b1b935..54fd5ae5 100644 --- a/src/test/regress/sql/huge_clob.sql +++ b/src/test/regress/sql/huge_clob.sql @@ -241,6 +241,28 @@ end; call test_self_update(); +create or replace procedure test_update_delete is +v1 clob; +begin +execute immediate 'select b from cloblongtbl where a=1' into v1; +update cloblongtbl set b=v1 where a=1; +rollback; +update cloblongtbl set b=v1 where a=2; +commit; +end; +/ + +call test_update_delete(); + +begin; +delete from cloblongtbl where a < 3; +rollback; + +begin; +delete from cloblongtbl where a = 1; +delete from cloblongtbl where a = 2; +rollback; + drop table if exists cloblongtbl; -- clean drop schema if exists huge_clob cascade;