diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-07-16 05:07:00 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-07-16 05:07:00 +0000 |
commit | f31dc0ada731d89313dbca7ef5da91d674fc640c (patch) | |
tree | a9c8343c489be6f99c5a9dff58838f72cf7d5dc4 /src/backend/utils/adt/ruleutils.c | |
parent | 237e5dfa581503b2ab877c73eecde517d284563c (diff) | |
download | postgresql-f31dc0ada731d89313dbca7ef5da91d674fc640c.tar.gz postgresql-f31dc0ada731d89313dbca7ef5da91d674fc640c.zip |
Partial indexes work again, courtesy of Martijn van Oosterhout.
Note: I didn't force an initdb, figuring that one today was enough.
However, there is a new function in pg_proc.h, and pg_dump won't be
able to dump partial indexes until you add that function.
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 5f7cfead6c1..afc2b63430b 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.79 2001/07/10 00:02:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.80 2001/07/16 05:06:59 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -40,6 +40,7 @@ #include <unistd.h> #include <fcntl.h> +#include "catalog/heap.h" #include "catalog/pg_index.h" #include "catalog/pg_operator.h" #include "catalog/pg_shadow.h" @@ -555,6 +556,64 @@ pg_get_indexdef(PG_FUNCTION_ARGS) /* ---------- + * get_expr - Decompile an expression tree + * + * Input: an expression tree in nodeToString form, and a relation OID + * + * Output: reverse-listed expression + * + * 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. + * ---------- + */ +Datum +pg_get_expr(PG_FUNCTION_ARGS) +{ + text *expr = PG_GETARG_TEXT_P(0); + Oid relid = PG_GETARG_OID(1); + text *result; + Node *node; + List *context; + char *exprstr; + char *relname; + char *str; + + /* Get the name for the relation */ + relname = get_rel_name(relid); + if (relname == NULL) + PG_RETURN_NULL(); /* should we raise an error? */ + + /* Convert input TEXT object to C string */ + exprstr = DatumGetCString(DirectFunctionCall1(textout, + PointerGetDatum(expr))); + + /* Convert expression to node tree */ + node = (Node *) stringToNode(exprstr); + + /* + * If top level is a List, assume it is an implicit-AND structure, + * and convert to explicit AND. This is needed for partial index + * predicates. + */ + if (node && IsA(node, List)) + { + node = (Node *) make_ands_explicit((List *) node); + } + + /* Deparse */ + context = deparse_context_for(relname, relid); + str = deparse_expression(node, context, false); + + /* Pass the result back as TEXT */ + result = DatumGetTextP(DirectFunctionCall1(textin, + CStringGetDatum(str))); + + PG_RETURN_TEXT_P(result); +} + + +/* ---------- * get_userbyid - Get a user name by usesysid and * fallback to 'unknown (UID=n)' * ---------- |