aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/partitionfuncs.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2018-12-12 09:49:39 +0900
committerMichael Paquier <michael@paquier.xyz>2018-12-12 09:49:39 +0900
commitcc53123bcc9d8786acae2885c3a0897b7be34a02 (patch)
treeb4c2e06c6a4afe5f651ea7fb192b3a4d460ef065 /src/backend/utils/adt/partitionfuncs.c
parent7a28e9aa0fd966ed374d244896e397148336720a (diff)
downloadpostgresql-cc53123bcc9d8786acae2885c3a0897b7be34a02.tar.gz
postgresql-cc53123bcc9d8786acae2885c3a0897b7be34a02.zip
Tweak pg_partition_tree for undefined relations and unsupported relkinds
This fixes a crash which happened when calling the function directly with a relation OID referring to a non-existing object, and changes the behavior so as NULL is returned for unsupported relkinds instead of generating an error. This puts the new function in line with many other system functions, and eases actions like full scans of pg_class. Author: Michael Paquier Reviewed-by: Amit Langote, Stephen Frost Discussion: https://postgr.es/m/20181207010406.GO2407@paquier.xyz
Diffstat (limited to 'src/backend/utils/adt/partitionfuncs.c')
-rw-r--r--src/backend/utils/adt/partitionfuncs.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/backend/utils/adt/partitionfuncs.c b/src/backend/utils/adt/partitionfuncs.c
index 78dd2b542b5..6fb4f6bc50f 100644
--- a/src/backend/utils/adt/partitionfuncs.c
+++ b/src/backend/utils/adt/partitionfuncs.c
@@ -23,6 +23,7 @@
#include "funcapi.h"
#include "utils/fmgrprotos.h"
#include "utils/lsyscache.h"
+#include "utils/syscache.h"
/*
@@ -42,16 +43,16 @@ pg_partition_tree(PG_FUNCTION_ARGS)
FuncCallContext *funcctx;
ListCell **next;
- /* Only allow relation types that can appear in partition trees. */
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(rootrelid)))
+ PG_RETURN_NULL();
+
+ /* Return NULL for relation types that cannot appear in partition trees */
if (relkind != RELKIND_RELATION &&
relkind != RELKIND_FOREIGN_TABLE &&
relkind != RELKIND_INDEX &&
relkind != RELKIND_PARTITIONED_TABLE &&
relkind != RELKIND_PARTITIONED_INDEX)
- ereport(ERROR,
- (errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("\"%s\" is not a table, a foreign table, or an index",
- get_rel_name(rootrelid))));
+ PG_RETURN_NULL();
/* stuff done only on the first call of the function */
if (SRF_IS_FIRSTCALL())