diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-05-26 17:36:05 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-05-26 17:36:05 +0000 |
commit | 48938ab50686b98d2af4536bbf342a5011393815 (patch) | |
tree | 1d2221d7c2af9c90f321e19b4a8a1e231b91c35e /src/backend/utils/adt/ruleutils.c | |
parent | 99bf328237d89e0fd22821a940d4af0506353218 (diff) | |
download | postgresql-48938ab50686b98d2af4536bbf342a5011393815.tar.gz postgresql-48938ab50686b98d2af4536bbf342a5011393815.zip |
Allow the second argument of pg_get_expr() to be just zero when deparsing
an expression that's not supposed to contain variables. Per discussion
with Gevik Babakhani, this eliminates the need for an ugly kluge (namely,
specifying some unrelated relation name). Remove one such kluge from
pg_dump.
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 8d06f54e479..8e031fd5027 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.297 2009/04/05 19:59:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.298 2009/05/26 17:36:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -146,7 +146,7 @@ static char *pg_get_indexdef_worker(Oid indexrelid, int colno, bool showTblSpc, int prettyFlags); static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags); -static char *pg_get_expr_worker(text *expr, Oid relid, char *relname, +static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags); static int print_function_arguments(StringInfo buf, HeapTuple proctup, bool print_table_args, bool print_defaults); @@ -1198,7 +1198,8 @@ decompile_column_index_array(Datum column_index_array, Oid relId, * * Currently, the expression can only refer to a single relation, namely * the one specified by the second parameter. This is sufficient for - * partial indexes, column default expressions, etc. + * partial indexes, column default expressions, etc. We also support + * Var-free expressions, for which the OID can be InvalidOid. * ---------- */ Datum @@ -1208,12 +1209,24 @@ pg_get_expr(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(1); char *relname; - /* Get the name for the relation */ - relname = get_rel_name(relid); - if (relname == NULL) - PG_RETURN_NULL(); /* should we raise an error? */ + if (OidIsValid(relid)) + { + /* Get the name for the relation */ + relname = get_rel_name(relid); - PG_RETURN_TEXT_P(string_to_text(pg_get_expr_worker(expr, relid, relname, 0))); + /* + * If the OID isn't actually valid, don't throw an error, just return + * NULL. This is a bit questionable, but it's what we've done + * historically, and it can help avoid unwanted failures when + * examining catalog entries for just-deleted relations. + */ + if (relname == NULL) + PG_RETURN_NULL(); + } + else + relname = NULL; + + PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, 0)); } Datum @@ -1227,16 +1240,22 @@ pg_get_expr_ext(PG_FUNCTION_ARGS) prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; - /* Get the name for the relation */ - relname = get_rel_name(relid); - if (relname == NULL) - PG_RETURN_NULL(); /* should we raise an error? */ + if (OidIsValid(relid)) + { + /* Get the name for the relation */ + relname = get_rel_name(relid); + /* See notes above */ + if (relname == NULL) + PG_RETURN_NULL(); + } + else + relname = NULL; - PG_RETURN_TEXT_P(string_to_text(pg_get_expr_worker(expr, relid, relname, prettyFlags))); + PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags)); } -static char * -pg_get_expr_worker(text *expr, Oid relid, char *relname, int prettyFlags) +static text * +pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags) { Node *node; List *context; @@ -1249,14 +1268,19 @@ pg_get_expr_worker(text *expr, Oid relid, char *relname, int prettyFlags) /* Convert expression to node tree */ node = (Node *) stringToNode(exprstr); + pfree(exprstr); + + /* Prepare deparse context if needed */ + if (OidIsValid(relid)) + context = deparse_context_for(relname, relid); + else + context = NIL; + /* Deparse */ - context = deparse_context_for(relname, relid); str = deparse_expression_pretty(node, context, false, false, prettyFlags, 0); - pfree(exprstr); - - return str; + return string_to_text(str); } |