aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/ruleutils.c
diff options
context:
space:
mode:
authorStephen Frost <sfrost@snowman.net>2017-04-26 14:59:22 -0400
committerStephen Frost <sfrost@snowman.net>2017-04-26 14:59:22 -0400
commit0c76c2463e8ab4cfd633ad8de259050e3f28b78f (patch)
treec813d3a3e755661cd47d882718a42bb339b08479 /src/backend/utils/adt/ruleutils.c
parent49da00677dc25d83be44372918e21a405863ace2 (diff)
downloadpostgresql-0c76c2463e8ab4cfd633ad8de259050e3f28b78f.tar.gz
postgresql-0c76c2463e8ab4cfd633ad8de259050e3f28b78f.zip
pg_get_partkeydef: return NULL for non-partitions
Our general rule for pg_get_X(oid) functions is to simply return NULL when passed an invalid or inappropriate OID. Teach pg_get_partkeydef to do this also, making it easier for users to use this function when querying against tables with both partitions and non-partitions (such as pg_class). As a concrete example, this makes pg_dump's life a little easier. Author: Amit Langote
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r--src/backend/utils/adt/ruleutils.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 184e5daa05b..cbde1fff01c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -320,7 +320,7 @@ static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
int prettyFlags, bool missing_ok);
static char *pg_get_statisticsext_worker(Oid statextid, bool missing_ok);
static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags,
- bool attrsOnly);
+ bool attrsOnly, bool missing_ok);
static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
int prettyFlags, bool missing_ok);
static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname,
@@ -1555,10 +1555,14 @@ Datum
pg_get_partkeydef(PG_FUNCTION_ARGS)
{
Oid relid = PG_GETARG_OID(0);
+ char *res;
+
+ res = pg_get_partkeydef_worker(relid, PRETTYFLAG_INDENT, false, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
- PG_RETURN_TEXT_P(string_to_text(pg_get_partkeydef_worker(relid,
- PRETTYFLAG_INDENT,
- false)));
+ PG_RETURN_TEXT_P(string_to_text(res));
}
/* Internal version that just reports the column definitions */
@@ -1568,7 +1572,7 @@ pg_get_partkeydef_columns(Oid relid, bool pretty)
int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
- return pg_get_partkeydef_worker(relid, prettyFlags, true);
+ return pg_get_partkeydef_worker(relid, prettyFlags, true, false);
}
/*
@@ -1576,7 +1580,7 @@ pg_get_partkeydef_columns(Oid relid, bool pretty)
*/
static char *
pg_get_partkeydef_worker(Oid relid, int prettyFlags,
- bool attrsOnly)
+ bool attrsOnly, bool missing_ok)
{
Form_pg_partitioned_table form;
HeapTuple tuple;
@@ -1594,7 +1598,11 @@ pg_get_partkeydef_worker(Oid relid, int prettyFlags,
tuple = SearchSysCache1(PARTRELID, ObjectIdGetDatum(relid));
if (!HeapTupleIsValid(tuple))
+ {
+ if (missing_ok)
+ return NULL;
elog(ERROR, "cache lookup failed for partition key of %u", relid);
+ }
form = (Form_pg_partitioned_table) GETSTRUCT(tuple);