From 5363008a157a0f2612d51ead1fbc633a263f2d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=98=8E=E8=BD=A9?= <504013468@qq.com> Date: Tue, 11 Jun 2024 10:19:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E5=9B=BE=E5=87=BD=E6=95=B0=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/catalog/builtin_funcs.ini | 4 ++-- src/gausskernel/runtime/opfusion/opfusion.cpp | 6 ++++++ .../storage/access/common/reloptions.cpp | 4 ++-- .../storage/access/ubtree/ubtsearch.cpp | 4 +++- .../storage/access/ustore/knl_pruneuheap.cpp | 2 +- .../storage/access/ustore/knl_uhio.cpp | 1 + .../access/ustore/undo/knl_uundorecycle.cpp | 3 +-- .../rollback_catalog_maindb_92_935.sql | 11 +++++++++++ .../rollback_catalog_otherdb_92_935.sql | 11 +++++++++++ .../upgrade_catalog_maindb_92_935.sql | 15 +++++++++++++++ .../upgrade_catalog_otherdb_92_935.sql | 15 +++++++++++++++ src/include/opfusion/opfusion.h | 2 ++ 12 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback_catalog_maindb_92_935.sql create mode 100644 src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback_catalog_otherdb_92_935.sql create mode 100644 src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_935.sql create mode 100644 src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_935.sql diff --git a/src/common/backend/catalog/builtin_funcs.ini b/src/common/backend/catalog/builtin_funcs.ini index 0a6a555e4..f82388d39 100644 --- a/src/common/backend/catalog/builtin_funcs.ini +++ b/src/common/backend/catalog/builtin_funcs.ini @@ -3927,7 +3927,7 @@ ), AddFuncGroup( "gs_undo_translot_dump_xid", 1, - AddBuiltinFunc(_0(4438), _1("gs_undo_translot_dump_xid"), _2(2), _3(false), _4(true), _5(gs_undo_translot_dump_xid), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 28, 16), _21(8, 28, 16, 26, 25, 25, 25, 25, 26), _22(8, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "zone_id", "read_memory", "zone_id", "slot_xid", "start_undoptr", "end_undoptr","lsn", "slot_states"), _24(NULL), _25("gs_undo_translot_dump_xid"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) + AddBuiltinFunc(_0(4438), _1("gs_undo_translot_dump_xid"), _2(2), _3(false), _4(true), _5(gs_undo_translot_dump_xid), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 28, 16), _21(8, 28, 16, 26, 25, 25, 25, 25, 26), _22(8, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "zone_id", "read_memory", "zone_id", "slot_xid", "start_undoptr", "end_undoptr","slot_ptr", "slot_states"), _24(NULL), _25("gs_undo_translot_dump_xid"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) ), AddFuncGroup( "gs_undo_dump_record", 1, @@ -3935,7 +3935,7 @@ ), AddFuncGroup( "gs_undo_translot_dump_slot", 1, - AddBuiltinFunc(_0(4541), _1("gs_undo_translot_dump_slot"), _2(2), _3(false), _4(true), _5(gs_undo_translot_dump_slot), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 23, 16), _21(8, 23, 16, 26, 25, 25, 25, 25, 26), _22(8, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "zone_id", "read_memory", "zone_id", "slot_xid", "start_undoptr", "end_undoptr","lsn", "slot_states"), _24(NULL), _25("gs_undo_translot_dump_slot"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) + AddBuiltinFunc(_0(4541), _1("gs_undo_translot_dump_slot"), _2(2), _3(false), _4(true), _5(gs_undo_translot_dump_slot), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 23, 16), _21(8, 23, 16, 26, 25, 25, 25, 25, 26), _22(8, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "zone_id", "read_memory", "zone_id", "slot_xid", "start_undoptr", "end_undoptr","slot_ptr", "slot_states"), _24(NULL), _25("gs_undo_translot_dump_slot"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) ), AddFuncGroup( "gs_undo_dump_xid", 1, diff --git a/src/gausskernel/runtime/opfusion/opfusion.cpp b/src/gausskernel/runtime/opfusion/opfusion.cpp index 4cd2c4fe5..680b564ef 100644 --- a/src/gausskernel/runtime/opfusion/opfusion.cpp +++ b/src/gausskernel/runtime/opfusion/opfusion.cpp @@ -310,6 +310,11 @@ void OpFusion::setCurrentOpFusionObj(OpFusion *obj) u_sess->exec_cxt.CurrentOpFusionObj = obj; } +void OpFusion::setOpFusionReuseObj(OpFusion *obj) +{ + u_sess->opfusion_reuse_ctx.opfusionObj = obj; +} + void OpFusion::checkPermission() { bool check = false; @@ -1112,6 +1117,7 @@ void OpFusion::tearDown(OpFusion *opfusion) delete opfusion; OpFusion::setCurrentOpFusionObj(NULL); + OpFusion::setOpFusionReuseObj(NULL); } void OpFusion::clearForCplan(OpFusion *opfusion, CachedPlanSource *psrc) diff --git a/src/gausskernel/storage/access/common/reloptions.cpp b/src/gausskernel/storage/access/common/reloptions.cpp index 72bbb341a..4f8eee254 100644 --- a/src/gausskernel/storage/access/common/reloptions.cpp +++ b/src/gausskernel/storage/access/common/reloptions.cpp @@ -2236,8 +2236,8 @@ static void ValidateStrOptOrientation(const char *val) */ static void ValidateStrOptIndexsplit(const char *val) { - if (pg_strncasecmp(val, INDEXSPLIT_OPT_DEFAULT, strlen(val)) != 0 && - pg_strncasecmp(val, INDEXSPLIT_OPT_INSERTPT, strlen(val)) != 0) { + if (pg_strcasecmp(val, INDEXSPLIT_OPT_DEFAULT) != 0 && + pg_strcasecmp(val, INDEXSPLIT_OPT_INSERTPT) != 0) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Invalid string for \"INDEXSPLIT\" option"), errdetail("Valid string are \"default\", \"insertpt\"."))); } diff --git a/src/gausskernel/storage/access/ubtree/ubtsearch.cpp b/src/gausskernel/storage/access/ubtree/ubtsearch.cpp index 89a4468fa..90dda18b7 100644 --- a/src/gausskernel/storage/access/ubtree/ubtsearch.cpp +++ b/src/gausskernel/storage/access/ubtree/ubtsearch.cpp @@ -1579,7 +1579,9 @@ static bool UBTreeStepPage(IndexScanDesc scan, ScanDirection dir) } /* Step to next physical page */ - so->currPos.buf = _bt_walk_left(rel, so->currPos.buf); + Buffer temp = so->currPos.buf; + so->currPos.buf = InvalidBuffer; + so->currPos.buf = _bt_walk_left(rel, temp); /* if we're physically at end of index, return failure */ if (so->currPos.buf == InvalidBuffer) diff --git a/src/gausskernel/storage/access/ustore/knl_pruneuheap.cpp b/src/gausskernel/storage/access/ustore/knl_pruneuheap.cpp index 5901a791e..26c61f36a 100644 --- a/src/gausskernel/storage/access/ustore/knl_pruneuheap.cpp +++ b/src/gausskernel/storage/access/ustore/knl_pruneuheap.cpp @@ -903,7 +903,6 @@ static int UHeapPruneItem(const RelationBuffer *relbuf, OffsetNumber offnum, Tra * Count dead or recently dead tuple in result and update the space * that can be freed. */ - ndeleted++; Assert(!TransactionIdIsValid(xid) || !TransactionIdIsInProgress(xid)); if (TransactionIdIsValid(xid) && TransactionIdIsInProgress(xid)) { ereport(PANIC, (errcode(ERRCODE_DATA_CORRUPTED), @@ -917,6 +916,7 @@ static int UHeapPruneItem(const RelationBuffer *relbuf, OffsetNumber offnum, Tra /* Record dead item */ if (tupdead) { UHeapPruneRecordDead(prstate, offnum, relbuf->relation); + ndeleted++; } /* Record deleted item */ diff --git a/src/gausskernel/storage/access/ustore/knl_uhio.cpp b/src/gausskernel/storage/access/ustore/knl_uhio.cpp index 2d5318e84..984950dbd 100644 --- a/src/gausskernel/storage/access/ustore/knl_uhio.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uhio.cpp @@ -424,6 +424,7 @@ start: /* Temporarily tell other backends we are working on this subset. * pg_atomic_exchange_u32 should return the old value. */ + pgStatInfo->startBlockIndex = (uint32)random() % START_BLOCK_ARRAY_SIZE; uint32 index = pgStatInfo->startBlockIndex; BlockNumber startBlkno = pg_atomic_exchange_u32(&pgStatInfo->startBlockArray[index], InvalidBlockNumber); diff --git a/src/gausskernel/storage/access/ustore/undo/knl_uundorecycle.cpp b/src/gausskernel/storage/access/ustore/undo/knl_uundorecycle.cpp index 4d88157ba..d275805cb 100755 --- a/src/gausskernel/storage/access/ustore/undo/knl_uundorecycle.cpp +++ b/src/gausskernel/storage/access/ustore/undo/knl_uundorecycle.cpp @@ -439,10 +439,9 @@ bool RecycleUndoSpace(UndoZone *zone, TransactionId recycleXmin, TransactionId f lsn, recycleXid, g_recycleLoops, recycleXmin))); } END_CRIT_SECTION(); - - zone->UnlockUndoZone(); zone->ReleaseSpace(startUndoPtr, endUndoPtr, &g_forceRecycleSize); zone->ReleaseSlotSpace(start, recycle, &g_forceRecycleSize); + zone->UnlockUndoZone(); } else { /* zone has nothing to recycle. */ break; diff --git a/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback_catalog_maindb_92_935.sql b/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback_catalog_maindb_92_935.sql new file mode 100644 index 000000000..b102902d8 --- /dev/null +++ b/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback_catalog_maindb_92_935.sql @@ -0,0 +1,11 @@ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4541; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_slot'; + +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4438; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_xid'; diff --git a/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback_catalog_otherdb_92_935.sql b/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback_catalog_otherdb_92_935.sql new file mode 100644 index 000000000..b102902d8 --- /dev/null +++ b/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback_catalog_otherdb_92_935.sql @@ -0,0 +1,11 @@ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4541; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_slot'; + +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4438; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_xid'; diff --git a/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_935.sql b/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_935.sql new file mode 100644 index 000000000..e67475671 --- /dev/null +++ b/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_935.sql @@ -0,0 +1,15 @@ +/*------ add sys fuction gs_undo_translot_dump_slot ------*/ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4541; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_slot'; + +/*------ add sys fuction gs_undo_translot_dump_xid ------*/ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4438; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_xid'; diff --git a/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_935.sql b/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_935.sql new file mode 100644 index 000000000..e67475671 --- /dev/null +++ b/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_935.sql @@ -0,0 +1,15 @@ +/*------ add sys fuction gs_undo_translot_dump_slot ------*/ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, int4, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4541; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_slot(int4, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_slot'; + +/*------ add sys fuction gs_undo_translot_dump_xid ------*/ +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT lsn text, OUT gs_undo_translot oid) CASCADE; +DROP FUNCTION IF EXISTS pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4438; +CREATE OR REPLACE FUNCTION pg_catalog.gs_undo_translot_dump_xid(xid, boolean, OUT zone_id oid, OUT slot_xid text, OUT start_undoptr text, OUT end_undoptr text, OUT slot_ptr text, OUT gs_undo_translot oid) +RETURNS SETOF record LANGUAGE INTERNAL as 'gs_undo_translot_dump_xid'; diff --git a/src/include/opfusion/opfusion.h b/src/include/opfusion/opfusion.h index cd4e8e3f3..0a70230f3 100644 --- a/src/include/opfusion/opfusion.h +++ b/src/include/opfusion/opfusion.h @@ -71,6 +71,8 @@ public: static void setCurrentOpFusionObj(OpFusion* obj); + static void setOpFusionReuseObj(OpFusion* obj); + static bool process(int op, StringInfo msg, char* completionTag, bool isTopLevel, bool* isQueryCompleted); static void SaveInGPC(OpFusion* obj);