Re: How about to have relnamespace and relrole?

Поиск
Список
Период
Сортировка
От Kyotaro HORIGUCHI
Тема Re: How about to have relnamespace and relrole?
Дата
Msg-id 20150409.172510.29010318.horiguchi.kyotaro@lab.ntt.co.jp
обсуждение исходный текст
Ответ на Re: How about to have relnamespace and relrole?  (Andrew Dunstan <andrew@dunslane.net>)
Ответы Re: How about to have relnamespace and relrole?  (Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>)
Список pgsql-hackers
Hello, sorry for the absence. I changed the regnamespace's
behavior as the same as the other reg* types. And I attached a
patch as separate one that fixes regroleout to do the same as the
other reg* types, because I have

0001-Add-regrole_v6.patch : fix regnamespace to behave as the   same as the other reg* types.

0001-Make-regnamespace-behave-as-the-same-as-other-reg-ty.patch: Diff from v5 to v6, only for convinience.

0001-Fix-regroleout-s-behavior-following-other-out-functi.patch: Fixes regroleout so as to behave as the same as other
reg*types, but might be a bit too large.
 


At Wed, 01 Apr 2015 14:46:01 -0400, Andrew Dunstan <andrew@dunslane.net> wrote in <551C3CE9.4080503@dunslane.net>
> > But in any case I cannot see a reason to treat regnamespace
> > differently
> > from the existing types on this point.
> >
> >             
> 
> Good points.
> 
> I agree re namespace. And I also agree that shared dependency support
> is not worth the trouble, especially not just to support regrole. I'm
> not sure that's a reason to reject regrole entirely, though. However,
> I also think there is a significantly less compelling case for it than
> for regnamespace, based on the number of times I have wanted each.
> 
> Anybody else have thoughts on this?

Yeah, that's my thinko. regnamespace in the attached patch
behaves as the same to other reg* types. On the way fixing it, I
found a bug that regnamespaceout returns NULL for removed shema
name. I fixed it, too.

Addition to that, regroleout raises exception for invalid role
oids. This is unwanted behavior but GetUserNameFromId is needed
to have one extra parameter 'noerr' to fix this. This fix is
attached as another patch.

regards,

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index da1f25f..6d1f02d 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -4321,7 +4321,8 @@ SET xmloption TO { DOCUMENT | CONTENT };    an object identifier.  There are also several alias
typesfor    <type>oid</>: <type>regproc</>, <type>regprocedure</>,    <type>regoper</>, <type>regoperator</>,
<type>regclass</>,
-    <type>regtype</>, <type>regconfig</>, and <type>regdictionary</>.
+    <type>regtype</>, <type>regrole</>, <type>regnamespace</>, 
+    <type>regconfig</>, and <type>regdictionary</>.    <xref linkend="datatype-oid-table"> shows an overview.
</para>
@@ -4431,6 +4432,20 @@ SELECT * FROM pg_attribute       </row>       <row>
+        <entry><type>regrole</></entry>
+        <entry><structname>pg_authid</></entry>
+        <entry>role name</entry>
+        <entry><literal>smithee</></entry>
+       </row>
+
+       <row>
+        <entry><type>regnamespace</></entry>
+        <entry><structname>pg_namespace</></entry>
+        <entry>namespace name</entry>
+        <entry><literal>pg_catalog</></entry>
+       </row>
+
+       <row>        <entry><type>regconfig</></entry>        <entry><structname>pg_ts_config</></entry>
<entry>textsearch configuration</entry>
 
@@ -4448,29 +4463,37 @@ SELECT * FROM pg_attribute    </table>   <para>
-    All of the OID alias types accept schema-qualified names, and will
-    display schema-qualified names on output if the object would not
-    be found in the current search path without being qualified.
-    The <type>regproc</> and <type>regoper</> alias types will only
-    accept input names that are unique (not overloaded), so they are
-    of limited use; for most uses <type>regprocedure</> or
+    All of the OID alias types for objects grouped by namespace accept
+    schema-qualified names, and will display schema-qualified names on output
+    if the object would not be found in the current search path without being
+    qualified.  The <type>regproc</> and <type>regoper</> alias types will
+    only accept input names that are unique (not overloaded), so they are of
+    limited use; for most uses <type>regprocedure</> or    <type>regoperator</> are more appropriate.  For
<type>regoperator</>,   unary operators are identified by writing <literal>NONE</> for the unused    operand.
</para>
+   <para> An additional property of most of the OID alias types is the
+    creation of dependencies.  If a constant of one of these types
+    appears in a stored expression (such as a column default
+    expression or view), it creates a dependency on the referenced
+    object.  For example, if a column has a default expression
+    <literal>nextval('my_seq'::regclass)</>,
+    <productname>PostgreSQL</productname> understands that the default
+    expression depends on the sequence <literal>my_seq</>; the system
+    will not let the sequence be dropped without first removing the
+    default expression. <type>regrole</> is the only exception for the
+    property. Constants of this type is not allowed in such
+    expressions.  </para>
+
+   <note>   <para>
-    An additional property of the OID alias types is the creation of
-    dependencies.  If a
-    constant of one of these types appears in a stored expression
-    (such as a column default expression or view), it creates a dependency
-    on the referenced object.  For example, if a column has a default
-    expression <literal>nextval('my_seq'::regclass)</>,
-    <productname>PostgreSQL</productname>
-    understands that the default expression depends on the sequence
-    <literal>my_seq</>; the system will not let the sequence be dropped
-    without first removing the default expression.
+    The OID alias types do not completely follow transaction isolation
+    rules. The planner also treats them as simple constants, which may
+    result in sub-optimal planning.   </para>
+   </note>   <para>    Another identifier type used by the system is <type>xid</>, or transaction
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index ad49964..f30d5e6 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -113,6 +113,10 @@ static const struct typinfo TypInfo[] = {    F_REGPROCIN, F_REGPROCOUT},    {"regtype",
REGTYPEOID,0, 4, true, 'i', 'p', InvalidOid,    F_REGTYPEIN, F_REGTYPEOUT},
 
+    {"regrole", REGROLEOID, 0, 4, true, 'i', 'p', InvalidOid,
+    F_REGROLEIN, F_REGROLEOUT},
+    {"regnamespace", REGNAMESPACEOID, 0, 4, true, 'i', 'p', InvalidOid,
+    F_REGNAMESPACEIN, F_REGNAMESPACEOUT},    {"text", TEXTOID, 0, -1, false, 'i', 'x', DEFAULT_COLLATION_OID,
F_TEXTIN,F_TEXTOUT},    {"oid", OIDOID, 0, 4, true, 'i', 'p', InvalidOid,
 
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index bacb242..858d52f 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -1597,6 +1597,24 @@ find_expr_references_walker(Node *node,                        add_object_address(OCLASS_TSDICT,
objoid,0,                                           context->addrs);                    break;
 
+
+                case REGNAMESPACEOID:
+                    objoid = DatumGetObjectId(con->constvalue);
+                    if (SearchSysCacheExists1(NAMESPACEOID,
+                                              ObjectIdGetDatum(objoid)))
+                        add_object_address(OCLASS_SCHEMA, objoid, 0,
+                                           context->addrs);
+                    break;
+
+                /*
+                 * Dependencies for regrole is shared among all databases, so
+                 * explicitly inhibit to have dependencies.
+                 */
+                case REGROLEOID:
+                    ereport(ERROR,
+                            (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                             errmsg("constant of the type \'regrole\' cannot be used here")));
+                break;            }        }        return false;
diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c
index 11d663b..a41f577 100644
--- a/src/backend/utils/adt/regproc.c
+++ b/src/backend/utils/adt/regproc.c
@@ -40,6 +40,7 @@#include "utils/lsyscache.h"#include "utils/syscache.h"#include "utils/tqual.h"
+#include "utils/acl.h"static char *format_operator_internal(Oid operator_oid, bool force_qualify);static char
*format_procedure_internal(Oidprocedure_oid, bool force_qualify);
 
@@ -1553,6 +1554,199 @@ regdictionarysend(PG_FUNCTION_ARGS)    return oidsend(fcinfo);}
+/*
+ * regrolein    - converts "rolename" to role OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0).  In all other cases, the input must
+ * match an existing pg_authid entry.
+ *
+ * This function is not needed in bootstrap mode, so we don't worry about
+ * making it work then.
+ */
+Datum
+regrolein(PG_FUNCTION_ARGS)
+{
+    char       *role_name_or_oid = PG_GETARG_CSTRING(0);
+    Oid            result;
+
+    /* '-' ? */
+    if (strcmp(role_name_or_oid, "-") == 0)
+        PG_RETURN_OID(InvalidOid);
+
+    /* Numeric OID? */
+    if (role_name_or_oid[0] >= '0' &&
+        role_name_or_oid[0] <= '9' &&
+        strspn(role_name_or_oid, "0123456789") == strlen(role_name_or_oid))
+    {
+        result = DatumGetObjectId(DirectFunctionCall1(oidin,
+                                         CStringGetDatum(role_name_or_oid)));
+        PG_RETURN_OID(result);
+    }
+
+    /* Normal case: see if the name matches any pg_authid entry. */
+    result = get_role_oid(role_name_or_oid, false);
+
+    PG_RETURN_OID(result);
+}
+
+/*
+ * to_regrole        - converts "rolename" to role OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regrole(PG_FUNCTION_ARGS)
+{
+    char       *role_name = PG_GETARG_CSTRING(0);
+    Oid            result;
+
+    result = get_role_oid(role_name, true);
+    
+    if (OidIsValid(result))
+        PG_RETURN_OID(result);
+    else
+        PG_RETURN_NULL();
+}
+
+/*
+ * regroleout        - converts role OID to "role_name"
+ */
+Datum
+regroleout(PG_FUNCTION_ARGS)
+{
+    Oid            roleoid = PG_GETARG_OID(0);
+    char       *result;
+
+
+    if (roleoid == InvalidOid)
+    {
+        result = pstrdup("-");
+        PG_RETURN_CSTRING(result);
+    }
+
+    result = GetUserNameFromId(roleoid);
+    PG_RETURN_CSTRING(result);
+}
+
+/*
+ *        regrolerecv    - converts external binary format to regrole
+ */
+Datum
+regrolerecv(PG_FUNCTION_ARGS)
+{
+    /* Exactly the same as oidrecv, so share code */
+    return oidrecv(fcinfo);
+}
+
+/*
+ *        regrolesend    - converts regrole to binary format
+ */
+Datum
+regrolesend(PG_FUNCTION_ARGS)
+{
+    /* Exactly the same as oidsend, so share code */
+    return oidsend(fcinfo);
+}
+
+/*
+ * regnamespacein        - converts "nspname" to namespace OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0).  In all other cases, the input must
+ * match an existing pg_namespace entry.
+ */
+Datum
+regnamespacein(PG_FUNCTION_ARGS)
+{
+    char       *nsp_name_or_oid = PG_GETARG_CSTRING(0);
+    Oid            result = InvalidOid;
+
+    /* '-' ? */
+    if (strcmp(nsp_name_or_oid, "-") == 0)
+        PG_RETURN_OID(InvalidOid);
+
+    /* Numeric OID? */
+    if (nsp_name_or_oid[0] >= '0' &&
+        nsp_name_or_oid[0] <= '9' &&
+        strspn(nsp_name_or_oid, "0123456789") == strlen(nsp_name_or_oid))
+    {
+        result = DatumGetObjectId(DirectFunctionCall1(oidin,
+                                        CStringGetDatum(nsp_name_or_oid)));
+        PG_RETURN_OID(result);
+    }
+
+    /* Normal case: see if the name matches any pg_namespace entry. */
+    result = get_namespace_oid(nsp_name_or_oid, false);
+
+    PG_RETURN_OID(result);
+}
+
+/*
+ * to_regnamespace        - converts "nspname" to namespace OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regnamespace(PG_FUNCTION_ARGS)
+{
+    char       *nsp_name = PG_GETARG_CSTRING(0);
+    Oid            result;
+
+    result = get_namespace_oid(nsp_name, true);
+
+    if (OidIsValid(result))
+        PG_RETURN_OID(result);
+    else
+        PG_RETURN_NULL();
+}
+
+/*
+ * regnamespaceout        - converts namespace OID to "nsp_name"
+ */
+Datum
+regnamespaceout(PG_FUNCTION_ARGS)
+{
+    Oid            nspid = PG_GETARG_OID(0);
+    char       *result;
+
+    if (nspid == InvalidOid)
+    {
+        result = pstrdup("-");
+        PG_RETURN_CSTRING(result);
+    }
+
+    result = get_namespace_name(nspid);
+    if (!result)
+    {
+        /* If OID doesn't match any namespace, return it numerically */
+        result = (char *) palloc(NAMEDATALEN);
+        snprintf(result, NAMEDATALEN, "%u", nspid);
+    }
+    PG_RETURN_CSTRING(result);
+}
+
+/*
+ *        regnamespacerecv    - converts external binary format to regnamespace
+ */
+Datum
+regnamespacerecv(PG_FUNCTION_ARGS)
+{
+    /* Exactly the same as oidrecv, so share code */
+    return oidrecv(fcinfo);
+}
+
+/*
+ *        regnamespacesend        - converts regnamespace to binary format
+ */
+Datum
+regnamespacesend(PG_FUNCTION_ARGS)
+{
+    /* Exactly the same as oidsend, so share code */
+    return oidsend(fcinfo);
+}/* * text_regclass: convert text to regclass
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 4dd3f9f..91399f7 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -3619,6 +3619,8 @@ convert_to_scalar(Datum value, Oid valuetypid, double *scaledvalue,        case REGTYPEOID:
case REGCONFIGOID:        case REGDICTIONARYOID:
 
+        case REGROLEOID:
+        case REGNAMESPACEOID:            *scaledvalue = convert_numeric_to_scalar(value, valuetypid);
*scaledlobound= convert_numeric_to_scalar(lobound, boundstypid);            *scaledhibound =
convert_numeric_to_scalar(hibound,boundstypid);
 
@@ -3724,6 +3726,8 @@ convert_numeric_to_scalar(Datum value, Oid typid)        case REGTYPEOID:        case
REGCONFIGOID:       case REGDICTIONARYOID:
 
+        case REGROLEOID:
+        case REGNAMESPACEOID:            /* we can treat OIDs as integers... */            return (double)
DatumGetObjectId(value);   }
 
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 1af43c6..5bb03dd 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -150,6 +150,8 @@ GetCCHashEqFuncs(Oid keytype, PGFunction *hashfunc, RegProcedure *eqfunc)        case REGTYPEOID:
    case REGCONFIGOID:        case REGDICTIONARYOID:
 
+        case REGROLEOID:
+        case REGNAMESPACEOID:            *hashfunc = hashoid;            *eqfunc = F_OIDEQ;
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index c49fe26..d1e303f 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -210,6 +210,20 @@ DATA(insert ( 3769     20 1288 a f ));DATA(insert ( 3769     23    0 a b ));DATA(insert (    25
22051079 i f ));DATA(insert ( 1043 2205 1079 i f ));
 
+DATA(insert (    26 4096    0 i b ));
+DATA(insert ( 4096     26    0 i b ));
+DATA(insert (    20 4096 1287 i f ));
+DATA(insert (    21 4096  313 i f ));
+DATA(insert (    23 4096    0 i b ));
+DATA(insert ( 4096     20 1288 a f ));
+DATA(insert ( 4096     23    0 a b ));
+DATA(insert (    26 4089    0 i b ));
+DATA(insert ( 4089     26    0 i b ));
+DATA(insert (    20 4089 1287 i f ));
+DATA(insert (    21 4089  313 i f ));
+DATA(insert (    23 4089    0 i b ));
+DATA(insert ( 4089     20 1288 a f ));
+DATA(insert ( 4089     23    0 a b ));/* * String category
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 62187fb..42d7269 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -3469,6 +3469,18 @@ DESCR("convert type name to regtype");DATA(insert OID = 1079 (  regclass            PGNSP PGUID
121 0 0 0 f f f f t f s 1 0 2205 "25" _null_ _null_ _null_ _null_    text_regclass _null_ _null_ _null_
));DESCR("converttext to regclass");
 
+DATA(insert OID = 4091 (  regrolein            PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4096 "2275" _null_ _null_
_null__null_ regrolein _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4092 (  regroleout        PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "4096" _null_ _null_ _null_
_null_regroleout _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4093 (  to_regrole        PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4096 "2275" _null_ _null_ _null_
_null_to_regrole _null_ _null_ _null_ ));
 
+DESCR("convert role name to regrole");
+DATA(insert OID = 4084 (  regnamespacein    PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4089 "2275" _null_ _null_ _null_
_null_regnamespacein _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4085 (  regnamespaceout    PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "4089" _null_ _null_ _null_
_null_regnamespaceout _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4086 (  to_regnamespace    PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4089 "2275" _null_ _null_ _null_
_null_to_regnamespace _null_ _null_ _null_ ));
 
+DESCR("convert namespace name to regnamespace");DATA(insert OID = 2246 ( fmgr_internal_validator PGNSP PGUID 12 1 0 0
0f f f f t f s 1 0 2278 "26" _null_ _null_ _null_ _null_ fmgr_internal_validator _null_ _null_ _null_
));DESCR("(internal)");DATA(insertOID = 2247 ( fmgr_c_validator    PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2278 "26"
_null__null_ _null_ _null_ fmgr_c_validator _null_ _null_ _null_ ));
 
@@ -3864,6 +3876,14 @@ DATA(insert OID = 2454 (  regtyperecv           PGNSP PGUID 12 1 0 0 0 f f f f t f i
1DESCR("I/O");DATA(insertOID = 2455 (  regtypesend           PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2206" _null_
_null__null_ _null_    regtypesend _null_ _null_ _null_ ));DESCR("I/O");
 
+DATA(insert OID = 4094 (  regrolerecv             PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 4096 "2281" _null_ _null_
_null__null_ regrolerecv _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4095 (  regrolesend           PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "4096" _null_ _null_
_null__null_    regrolesend _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4087 (  regnamespacerecv       PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 4089 "2281" _null_ _null_
_null__null_ regnamespacerecv _null_ _null_ _null_ ));
 
+DESCR("I/O");
+DATA(insert OID = 4088 (  regnamespacesend       PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "4089" _null_ _null_
_null__null_    regnamespacesend _null_ _null_ _null_ ));
 
+DESCR("I/O");DATA(insert OID = 2456 (  bit_recv               PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "2281 26
23"_null_ _null_ _null_ _null_  bit_recv _null_ _null_ _null_ ));DESCR("I/O");DATA(insert OID = 2457 (  bit_send
      PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1560" _null_ _null_ _null_ _null_    bit_send _null_ _null_ _null_
));
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 0a900dd..2493353 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -564,12 +564,22 @@ DATA(insert OID = 2206 ( regtype       PGNSP PGUID    4 t b N f t \054 0     0 2211
regtyDESCR("registeredtype");#define REGTYPEOID        2206
 
+DATA(insert OID = 4096 ( regrole       PGNSP PGUID    4 t b N f t \054 0     0 4097 regrolein regroleout regrolerecv
regrolesend- - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
 
+DESCR("registered role");
+#define REGROLEOID        4096
+
+DATA(insert OID = 4089 ( regnamespace  PGNSP PGUID    4 t b N f t \054 0     0 4090 regnamespacein regnamespaceout
regnamespacerecvregnamespacesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
 
+DESCR("registered namespace");
+#define REGNAMESPACEOID        4089
+DATA(insert OID = 2207 ( _regprocedure PGNSP PGUID -1 f b A f t \054 0 2202 0 array_in array_out array_recv array_send
-- array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));DATA(insert OID = 2208 ( _regoper       PGNSP PGUID -1 f b A
ft \054 0 2203 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_
));DATA(insertOID = 2209 ( _regoperator  PGNSP PGUID -1 f b A f t \054 0 2204 0 array_in array_out array_recv
array_send- - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));DATA(insert OID = 2210 ( _regclass       PGNSP
PGUID-1 f b A f t \054 0 2205 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_
_null__null_ ));DATA(insert OID = 2211 ( _regtype       PGNSP PGUID -1 f b A f t \054 0 2206 0 array_in array_out
array_recvarray_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));#define REGTYPEARRAYOID 2211
 
+DATA(insert OID = 4097 ( _regrole      PGNSP PGUID -1 f b A f t \054 0 4096 0 array_in array_out array_recv array_send
-- array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
 
+DATA(insert OID = 4090 ( _regnamespace PGNSP PGUID -1 f b A f t \054 0 4089 0 array_in array_out array_recv array_send
-- array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));/* uuid */DATA(insert OID = 2950 ( uuid            PGNSP
PGUID16 f b U f t \054 0 0 2951 uuid_in uuid_out uuid_recv uuid_send - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));
 
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 33a453f..9e2ee82 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -630,6 +630,16 @@ extern Datum regtypeout(PG_FUNCTION_ARGS);extern Datum regtyperecv(PG_FUNCTION_ARGS);extern Datum
regtypesend(PG_FUNCTION_ARGS);externDatum to_regtype(PG_FUNCTION_ARGS);
 
+extern Datum regrolein(PG_FUNCTION_ARGS);
+extern Datum regroleout(PG_FUNCTION_ARGS);
+extern Datum regrolerecv(PG_FUNCTION_ARGS);
+extern Datum regrolesend(PG_FUNCTION_ARGS);
+extern Datum to_regrole(PG_FUNCTION_ARGS);
+extern Datum regnamespacein(PG_FUNCTION_ARGS);
+extern Datum regnamespaceout(PG_FUNCTION_ARGS);
+extern Datum regnamespacerecv(PG_FUNCTION_ARGS);
+extern Datum regnamespacesend(PG_FUNCTION_ARGS);
+extern Datum to_regnamespace(PG_FUNCTION_ARGS);extern Datum regconfigin(PG_FUNCTION_ARGS);extern Datum
regconfigout(PG_FUNCTION_ARGS);externDatum regconfigrecv(PG_FUNCTION_ARGS);
 
diff --git a/src/test/regress/expected/regproc.out b/src/test/regress/expected/regproc.out
index 3342129..8c734f4 100644
--- a/src/test/regress/expected/regproc.out
+++ b/src/test/regress/expected/regproc.out
@@ -2,6 +2,7 @@-- regproc--/* If objects exist, return oids */
+CREATE ROLE regtestrole;-- without schemanameSELECT regoper('||/'); regoper 
@@ -39,6 +40,18 @@ SELECT regtype('int4'); integer(1 row)
+SELECT regrole('regtestrole');
+   regrole   
+-------------
+ regtestrole
+(1 row)
+
+SELECT regnamespace('pg_catalog');
+ regnamespace 
+--------------
+ pg_catalog
+(1 row)
+SELECT to_regoper('||/'); to_regoper ------------
@@ -75,6 +88,18 @@ SELECT to_regtype('int4'); integer(1 row)
+SELECT to_regrole('regtestrole');
+ to_regrole  
+-------------
+ regtestrole
+(1 row)
+
+SELECT to_regnamespace('pg_catalog');
+ to_regnamespace 
+-----------------
+ pg_catalog
+(1 row)
+-- with schemanameSELECT regoper('pg_catalog.||/'); regoper 
@@ -143,10 +168,11 @@ SELECT to_regtype('pg_catalog.int4');(1 row)/* If objects don't exist, raise errors. */
+DROP ROLE regtestrole;-- without schemanameSELECT regoper('||//');ERROR:  operator does not exist: ||//
-LINE 3: SELECT regoper('||//');
+LINE 1: SELECT regoper('||//');                       ^SELECT regoperator('++(int4,int4)');ERROR:  operator does not
exist:++(int4,int4)
 
@@ -168,6 +194,14 @@ SELECT regtype('int3');ERROR:  type "int3" does not existLINE 1: SELECT regtype('int3');
           ^
 
+SELECT regrole('regtestrole');
+ERROR:  role "regtestrole" does not exist
+LINE 1: SELECT regrole('regtestrole');
+                       ^
+SELECT regnamespace('nonexistent');
+ERROR:  schema "nonexistent" does not exist
+LINE 1: SELECT regnamespace('nonexistent');
+                            ^-- with schemanameSELECT regoper('ng_catalog.||/');ERROR:  schema "ng_catalog" does not
exist
@@ -231,6 +265,18 @@ SELECT to_regtype('int3'); (1 row)
+SELECT to_regrole('regtestrole');
+ to_regrole 
+------------
+ 
+(1 row)
+
+SELECT to_regnamespace('nonexistent');
+ to_regnamespace 
+-----------------
+ 
+(1 row)
+-- with schemanameSELECT to_regoper('ng_catalog.||/'); to_regoper 
diff --git a/src/test/regress/sql/regproc.sql b/src/test/regress/sql/regproc.sql
index cc90838..8edaf15 100644
--- a/src/test/regress/sql/regproc.sql
+++ b/src/test/regress/sql/regproc.sql
@@ -4,6 +4,7 @@/* If objects exist, return oids */
+CREATE ROLE regtestrole;-- without schemanameSELECT regoper('||/');
@@ -12,6 +13,8 @@ SELECT regproc('now');SELECT regprocedure('abs(numeric)');SELECT regclass('pg_class');SELECT
regtype('int4');
+SELECT regrole('regtestrole');
+SELECT regnamespace('pg_catalog');SELECT to_regoper('||/');SELECT to_regoperator('+(int4,int4)');
@@ -19,6 +22,8 @@ SELECT to_regproc('now');SELECT to_regprocedure('abs(numeric)');SELECT to_regclass('pg_class');SELECT
to_regtype('int4');
+SELECT to_regrole('regtestrole');
+SELECT to_regnamespace('pg_catalog');-- with schemaname
@@ -37,6 +42,8 @@ SELECT to_regtype('pg_catalog.int4');/* If objects don't exist, raise errors. */
+DROP ROLE regtestrole;
+-- without schemanameSELECT regoper('||//');
@@ -45,6 +52,8 @@ SELECT regproc('know');SELECT regprocedure('absinthe(numeric)');SELECT regclass('pg_classes');SELECT
regtype('int3');
+SELECT regrole('regtestrole');
+SELECT regnamespace('nonexistent');-- with schemaname
@@ -65,6 +74,8 @@ SELECT to_regproc('know');SELECT to_regprocedure('absinthe(numeric)');SELECT
to_regclass('pg_classes');SELECTto_regtype('int3');
 
+SELECT to_regrole('regtestrole');
+SELECT to_regnamespace('nonexistent');-- with schemaname

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: TABLESAMPLE patch
Следующее
От: Simon Riggs
Дата:
Сообщение: Re: TABLESAMPLE patch