!2552 对函数表达式计算阶段判断是否包含游标(refcursor)的逻辑进行剪枝优化

Merge pull request !2552 from april01xxx/dev_002_funcexpr
This commit is contained in:
opengauss-bot 2023-01-19 10:32:10 +00:00 committed by Gitee
commit 8deef3fa1e
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
6 changed files with 25 additions and 6 deletions

View File

@ -2030,11 +2030,11 @@
),
AddFuncGroup(
"cursor_to_xml", 1,
AddBuiltinFunc(_0(2925), _1("cursor_to_xml"), _2(5), _3(false), _4(false), _5(cursor_to_xml), _6(142), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(5, 1790, 23, 16, 16, 25), _21(NULL), _22(NULL), _23(5, "cursor", "count", "nulls", "tableforest", "targetns"), _24(NULL), _25("cursor_to_xml"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("map rows from cursor to XML"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
AddBuiltinFunc(_0(CURSORTOXMLOID), _1("cursor_to_xml"), _2(5), _3(false), _4(false), _5(cursor_to_xml), _6(142), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(5, 1790, 23, 16, 16, 25), _21(NULL), _22(NULL), _23(5, "cursor", "count", "nulls", "tableforest", "targetns"), _24(NULL), _25("cursor_to_xml"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("map rows from cursor to XML"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"cursor_to_xmlschema", 1,
AddBuiltinFunc(_0(2928), _1("cursor_to_xmlschema"), _2(4), _3(false), _4(false), _5(cursor_to_xmlschema), _6(142), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 1790, 16, 16, 25), _21(NULL), _22(NULL), _23(4, "cursor", "nulls", "tableforest", "targetns"), _24(NULL), _25("cursor_to_xmlschema"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("map cursor structure to XML Schema"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
AddBuiltinFunc(_0(CURSORTOXMLSCHEMAOID), _1("cursor_to_xmlschema"), _2(4), _3(false), _4(false), _5(cursor_to_xmlschema), _6(142), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 1790, 16, 16, 25), _21(NULL), _22(NULL), _23(4, "cursor", "nulls", "tableforest", "targetns"), _24(NULL), _25("cursor_to_xmlschema"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("map cursor structure to XML Schema"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"database_to_xml", 1,

View File

@ -1064,6 +1064,11 @@ bool IsPlpgsqlLanguageOid(Oid langoid)
bool isNull = true;
char* langName = NULL;
if (langoid == INTERNALlanguageId || langoid == ClanguageId
|| langoid == SQLlanguageId || langoid == JavalanguageId) {
return false;
}
Relation relation = heap_open(LanguageRelationId, NoLock);
tp = SearchSysCache1(LANGOID, ObjectIdGetDatum(langoid));
if (!HeapTupleIsValid(tp)) {

View File

@ -2145,7 +2145,7 @@ ExecInitFunc(ExprEvalStep *scratch, Expr *node, List *args, Oid funcid,
/* Only allow commit at CN, therefore only need to set atomic and
* relevant check at CN level.
*/
if (supportTranaction && IsA(node, FuncExpr)) {
if (!IsSystemObjOid(funcid) && supportTranaction && IsA(node, FuncExpr)) {
fssnode = makeNode(FunctionScanState);
if (!u_sess->SPI_cxt.is_allow_commit_rollback) {
fssnode->atomic = true;

View File

@ -840,7 +840,9 @@ void standard_ExecutorEnd(QueryDesc *queryDesc)
}
/* reset global values of perm space */
perm_space_value_reset();
if (g_instance.attr.attr_resource.enable_perm_space) {
perm_space_value_reset();
}
}
/* ----------------------------------------------------------------

View File

@ -51,6 +51,7 @@
#include "catalog/heap.h"
#include "catalog/namespace.h"
#include "catalog/pg_partition_fn.h"
#include "catalog/pg_proc.h"
#include "executor/exec/execdebug.h"
#include "nodes/nodeFuncs.h"
#include "parser/parsetree.h"
@ -2567,6 +2568,13 @@ bool func_has_refcursor_args(Oid Funcid, FunctionCallInfoData* fcinfo)
bool return_refcursor = false;
int out_count = 0; /* out arg count */
fcinfo->refcursor_data.return_number = 0;
fcinfo->refcursor_data.returnCursor = NULL;
if (IsSystemObjOid(Funcid) && Funcid != CURSORTOXMLOID && Funcid != CURSORTOXMLSCHEMAOID) {
return false;
}
proctup = SearchSysCache(PROCOID, ObjectIdGetDatum(Funcid), 0, 0, 0);
/*
@ -2580,8 +2588,6 @@ bool func_has_refcursor_args(Oid Funcid, FunctionCallInfoData* fcinfo)
allarg = get_func_arg_info(proctup, &p_argtypes, &p_argnames, &p_argmodes);
procStruct = (Form_pg_proc)GETSTRUCT(proctup);
fcinfo->refcursor_data.return_number = 0;
fcinfo->refcursor_data.returnCursor = NULL;
for (int i = 0; i < allarg; i++) {
if (p_argmodes != NULL && (p_argmodes[i] == 'o' || p_argmodes[i] == 'b')) {
out_count++;
@ -2614,6 +2620,10 @@ bool expr_func_has_refcursor_args(Oid Funcid)
char* p_argmodes = NULL;
bool use_cursor = false;
if (IsSystemObjOid(Funcid) && Funcid != CURSORTOXMLOID && Funcid != CURSORTOXMLSCHEMAOID) {
return false;
}
proctup = SearchSysCache(PROCOID, ObjectIdGetDatum(Funcid), 0, 0, 0);
/*

View File

@ -426,6 +426,8 @@ typedef FormData_pg_proc *Form_pg_proc;
#define DB4AI_EXPLAIN_MODEL_OID 7110
#define JSONAGGFUNCOID 3124
#define JSONOBJECTAGGFUNCOID 3403
#define CURSORTOXMLOID 2925
#define CURSORTOXMLSCHEMAOID 2928
/*
* Symbolic values for prokind column