Skip to content

Commit cb9fa80

Browse files
committed
Add new OID alias type regnamespace
Catalog version bumped Kyotaro HORIGUCHI
1 parent 0c90f67 commit cb9fa80

File tree

13 files changed

+174
-4
lines changed

13 files changed

+174
-4
lines changed

doc/src/sgml/datatype.sgml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4321,9 +4321,9 @@ SET xmloption TO { DOCUMENT | CONTENT };
43214321
an object identifier. There are also several alias types for
43224322
<type>oid</>: <type>regproc</>, <type>regprocedure</>,
43234323
<type>regoper</>, <type>regoperator</>, <type>regclass</>,
4324-
<type>regtype</>, <type>regrole</>, <type>regconfig</>, and
4325-
<type>regdictionary</>. <xref linkend="datatype-oid-table"> shows
4326-
an overview.
4324+
<type>regtype</>, <type>regrole</>, <type>regnamespace</>,
4325+
<type>regconfig</>, and <type>regdictionary</>.
4326+
<xref linkend="datatype-oid-table"> shows an overview.
43274327
</para>
43284328

43294329
<para>
@@ -4438,6 +4438,13 @@ SELECT * FROM pg_attribute
44384438
<entry><literal>smithee</></entry>
44394439
</row>
44404440

4441+
<row>
4442+
<entry><type>regnamespace</></entry>
4443+
<entry><structname>pg_namespace</></entry>
4444+
<entry>namespace name</entry>
4445+
<entry><literal>pg_catalog</></entry>
4446+
</row>
4447+
44414448
<row>
44424449
<entry><type>regconfig</></entry>
44434450
<entry><structname>pg_ts_config</></entry>

src/backend/bootstrap/bootstrap.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ static const struct typinfo TypInfo[] = {
115115
F_REGTYPEIN, F_REGTYPEOUT},
116116
{"regrole", REGROLEOID, 0, 4, true, 'i', 'p', InvalidOid,
117117
F_REGROLEIN, F_REGROLEOUT},
118+
{"regnamespace", REGNAMESPACEOID, 0, 4, true, 'i', 'p', InvalidOid,
119+
F_REGNAMESPACEIN, F_REGNAMESPACEOUT},
118120
{"text", TEXTOID, 0, -1, false, 'i', 'x', DEFAULT_COLLATION_OID,
119121
F_TEXTIN, F_TEXTOUT},
120122
{"oid", OIDOID, 0, 4, true, 'i', 'p', InvalidOid,

src/backend/catalog/dependency.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,14 @@ find_expr_references_walker(Node *node,
16031603
context->addrs);
16041604
break;
16051605

1606+
case REGNAMESPACEOID:
1607+
objoid = DatumGetObjectId(con->constvalue);
1608+
if (SearchSysCacheExists1(NAMESPACEOID,
1609+
ObjectIdGetDatum(objoid)))
1610+
add_object_address(OCLASS_SCHEMA, objoid, 0,
1611+
context->addrs);
1612+
break;
1613+
16061614
/*
16071615
* Dependencies for regrole should be shared among all
16081616
* databases, so explicitly inhibit to have dependencies.

src/backend/utils/adt/regproc.c

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,7 +1656,103 @@ regrolesend(PG_FUNCTION_ARGS)
16561656
return oidsend(fcinfo);
16571657
}
16581658

1659+
/*
1660+
* regnamespacein - converts "nspname" to namespace OID
1661+
*
1662+
* We also accept a numeric OID, for symmetry with the output routine.
1663+
*
1664+
* '-' signifies unknown (OID 0). In all other cases, the input must
1665+
* match an existing pg_namespace entry.
1666+
*/
1667+
Datum
1668+
regnamespacein(PG_FUNCTION_ARGS)
1669+
{
1670+
char *nsp_name_or_oid = PG_GETARG_CSTRING(0);
1671+
Oid result = InvalidOid;
1672+
1673+
/* '-' ? */
1674+
if (strcmp(nsp_name_or_oid, "-") == 0)
1675+
PG_RETURN_OID(InvalidOid);
1676+
1677+
/* Numeric OID? */
1678+
if (nsp_name_or_oid[0] >= '0' &&
1679+
nsp_name_or_oid[0] <= '9' &&
1680+
strspn(nsp_name_or_oid, "0123456789") == strlen(nsp_name_or_oid))
1681+
{
1682+
result = DatumGetObjectId(DirectFunctionCall1(oidin,
1683+
CStringGetDatum(nsp_name_or_oid)));
1684+
PG_RETURN_OID(result);
1685+
}
1686+
1687+
/* Normal case: see if the name matches any pg_namespace entry. */
1688+
result = get_namespace_oid(nsp_name_or_oid, false);
1689+
1690+
PG_RETURN_OID(result);
1691+
}
1692+
1693+
/*
1694+
* to_regnamespace - converts "nspname" to namespace OID
1695+
*
1696+
* If the name is not found, we return NULL.
1697+
*/
1698+
Datum
1699+
to_regnamespace(PG_FUNCTION_ARGS)
1700+
{
1701+
char *nsp_name = PG_GETARG_CSTRING(0);
1702+
Oid result;
1703+
1704+
result = get_namespace_oid(nsp_name, true);
1705+
1706+
if (OidIsValid(result))
1707+
PG_RETURN_OID(result);
1708+
else
1709+
PG_RETURN_NULL();
1710+
}
1711+
1712+
/*
1713+
* regnamespaceout - converts namespace OID to "nsp_name"
1714+
*/
1715+
Datum
1716+
regnamespaceout(PG_FUNCTION_ARGS)
1717+
{
1718+
Oid nspid = PG_GETARG_OID(0);
1719+
char *result;
1720+
1721+
if (nspid == InvalidOid)
1722+
{
1723+
result = pstrdup("-");
1724+
PG_RETURN_CSTRING(result);
1725+
}
16591726

1727+
result = get_namespace_name(nspid);
1728+
if (!result)
1729+
{
1730+
/* If OID doesn't match any namespace, return it numerically */
1731+
result = (char *) palloc(NAMEDATALEN);
1732+
snprintf(result, NAMEDATALEN, "%u", nspid);
1733+
}
1734+
PG_RETURN_CSTRING(result);
1735+
}
1736+
1737+
/*
1738+
* regnamespacerecv - converts external binary format to regnamespace
1739+
*/
1740+
Datum
1741+
regnamespacerecv(PG_FUNCTION_ARGS)
1742+
{
1743+
/* Exactly the same as oidrecv, so share code */
1744+
return oidrecv(fcinfo);
1745+
}
1746+
1747+
/*
1748+
* regnamespacesend - converts regnamespace to binary format
1749+
*/
1750+
Datum
1751+
regnamespacesend(PG_FUNCTION_ARGS)
1752+
{
1753+
/* Exactly the same as oidsend, so share code */
1754+
return oidsend(fcinfo);
1755+
}
16601756

16611757
/*
16621758
* text_regclass: convert text to regclass

src/backend/utils/adt/selfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3620,6 +3620,7 @@ convert_to_scalar(Datum value, Oid valuetypid, double *scaledvalue,
36203620
case REGCONFIGOID:
36213621
case REGDICTIONARYOID:
36223622
case REGROLEOID:
3623+
case REGNAMESPACEOID:
36233624
*scaledvalue = convert_numeric_to_scalar(value, valuetypid);
36243625
*scaledlobound = convert_numeric_to_scalar(lobound, boundstypid);
36253626
*scaledhibound = convert_numeric_to_scalar(hibound, boundstypid);
@@ -3726,6 +3727,7 @@ convert_numeric_to_scalar(Datum value, Oid typid)
37263727
case REGCONFIGOID:
37273728
case REGDICTIONARYOID:
37283729
case REGROLEOID:
3730+
case REGNAMESPACEOID:
37293731
/* we can treat OIDs as integers... */
37303732
return (double) DatumGetObjectId(value);
37313733
}

src/backend/utils/cache/catcache.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ GetCCHashEqFuncs(Oid keytype, PGFunction *hashfunc, RegProcedure *eqfunc)
151151
case REGCONFIGOID:
152152
case REGDICTIONARYOID:
153153
case REGROLEOID:
154+
case REGNAMESPACEOID:
154155
*hashfunc = hashoid;
155156

156157
*eqfunc = F_OIDEQ;

src/include/catalog/catversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 201505083
56+
#define CATALOG_VERSION_NO 201505091
5757

5858
#endif

src/include/catalog/pg_cast.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,13 @@ DATA(insert ( 21 4096 313 i f ));
217217
DATA(insert ( 23 4096 0 i b ));
218218
DATA(insert ( 4096 20 1288 a f ));
219219
DATA(insert ( 4096 23 0 a b ));
220+
DATA(insert ( 26 4089 0 i b ));
221+
DATA(insert ( 4089 26 0 i b ));
222+
DATA(insert ( 20 4089 1287 i f ));
223+
DATA(insert ( 21 4089 313 i f ));
224+
DATA(insert ( 23 4089 0 i b ));
225+
DATA(insert ( 4089 20 1288 a f ));
226+
DATA(insert ( 4089 23 0 a b ));
220227

221228
/*
222229
* String category

src/include/catalog/pg_proc.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3488,6 +3488,13 @@ DESCR("I/O");
34883488
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_ _null_ to_regrole _null_ _null_ _null_ ));
34893489
DESCR("convert role name to regrole");
34903490

3491+
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_ _null_ regnamespacein _null_ _null_ _null_ ));
3492+
DESCR("I/O");
3493+
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_ _null_ regnamespaceout _null_ _null_ _null_ ));
3494+
DESCR("I/O");
3495+
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_ _null_ to_regnamespace _null_ _null_ _null_ ));
3496+
DESCR("convert namespace name to regnamespace");
3497+
34913498
DATA(insert OID = 2246 ( fmgr_internal_validator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ fmgr_internal_validator _null_ _null_ _null_ ));
34923499
DESCR("(internal)");
34933500
DATA(insert OID = 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_ _null_ fmgr_c_validator _null_ _null_ _null_ ));
@@ -3888,6 +3895,10 @@ DATA(insert OID = 4094 ( regrolerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i
38883895
DESCR("I/O");
38893896
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_ _null_ regrolesend _null_ _null_ _null_ ));
38903897
DESCR("I/O");
3898+
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_ _null_ regnamespacerecv _null_ _null_ _null_ ));
3899+
DESCR("I/O");
3900+
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_ _null_ regnamespacesend _null_ _null_ _null_ ));
3901+
DESCR("I/O");
38913902
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_ _null_ bit_recv _null_ _null_ _null_ ));
38923903
DESCR("I/O");
38933904
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_ _null_ bit_send _null_ _null_ _null_ ));

src/include/catalog/pg_type.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,13 +568,18 @@ DATA(insert OID = 4096 ( regrole PGNSP PGUID 4 t b N f t \054 0 0 4097 re
568568
DESCR("registered role");
569569
#define REGROLEOID 4096
570570

571+
DATA(insert OID = 4089 ( regnamespace PGNSP PGUID 4 t b N f t \054 0 0 4090 regnamespacein regnamespaceout regnamespacerecv regnamespacesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
572+
DESCR("registered namespace");
573+
#define REGNAMESPACEOID 4089
574+
571575
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_ ));
572576
DATA(insert OID = 2208 ( _regoper PGNSP PGUID -1 f b A f t \054 0 2203 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
573577
DATA(insert OID = 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_ ));
574578
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_ ));
575579
DATA(insert OID = 2211 ( _regtype PGNSP PGUID -1 f b A f t \054 0 2206 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
576580
#define REGTYPEARRAYOID 2211
577581
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_ ));
582+
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_ ));
578583

579584
/* uuid */
580585
DATA(insert OID = 2950 ( uuid PGNSP PGUID 16 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_ ));

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy