default namespace (schema) confusion
I have been looking forward to schemas (namespaces) for sometime.
I had not been able to decipher the schema symantics necessary for a
default schema, until I hacked the source a bit.
Now I know that the rules to get a default schema using
db_user_namespace = true
search_path = '$user,public'
in postgresql.conf
the user logs in as
psql testdb testuser
but the userid is really
testuser@testdb
if a schema named "testuser@testdb" exists
the user gets it as a default schema
otherwise the default schema is public;
and if the user is a global user
the login is
psql testdb globuser@
and the required schema is "globuser"
this use of "@" in the default schema is a bit counter intuitive
so I offer the following patch against CVS
it tries the userid as found in pg_user,
then strips off the @db stuff if possible
--- src/backend/catalog/namespace.c Thu Oct 17 21:23:34 2002
+++ src/backend/catalog/namespace_2.c Thu Oct 17 21:21:52 2002
@@ -1386,8 +1386,10 @@
if (HeapTupleIsValid(tuple))
{
char *uname;
+ char *uname_local;
uname = NameStr(((Form_pg_shadow)
GETSTRUCT(tuple))->usename);
namespaceId =
GetSysCacheOid(NAMESPACENAME,
CStringGetDatum(uname),
0, 0, 0);
@@ -1396,7 +1398,25 @@
!intMember(namespaceId,
oidlist) &&
pg_namespace_aclcheck(namespaceId, userId,
ACL_USAGE) == ACLCHECK_OK)
+ {
oidlist = lappendi(oidlist,
namespaceId);
+ }
+ else
+ {
+ uname_local = (char *)
malloc(strlen(uname)); + strcpy
(uname_local,uname);
+ uname_local =
strtok(uname_local,"@");
+ namespaceId =
GetSysCacheOid(NAMESPACENAME,
+
CStringGetDatum(uname_local),
+
0, 0, 0);
+ if (OidIsValid(namespaceId) &&
+ !intMember(namespaceId,
oidlist) &&
+
pg_namespace_aclcheck(namespaceId, userId,
+
ACL_USAGE) == ACLCHECK_OK)
+ oidlist =
lappendi(oidlist, namespaceId);
+ free(uname_local);
+ }
+
}
}
else
Carl Anderson <candrsn@mindspring.com> writes:
this use of "@" in the default schema is a bit counter intuitive
so I offer the following patch against CVS
Hmm, this seems like a wart, but then the db_user_namespace feature
is an acknowledged wart already.
I think I'd be willing to hold still for this if it happens only when
db_user_namespace is on. Comments anyone?
+ uname_local = (char *)
malloc(strlen(uname)); + strcpy
(uname_local,uname);
Use pstrdup, please.
regards, tom lane
Tom Lane wrote:
Carl Anderson <candrsn@mindspring.com> writes:
this use of "@" in the default schema is a bit counter intuitive
so I offer the following patch against CVSHmm, this seems like a wart, but then the db_user_namespace feature
is an acknowledged wart already.I think I'd be willing to hold still for this if it happens only when
db_user_namespace is on. Comments anyone?
I dislike double-testing the username in schema areas but not other
places. Seems if we do it, we should do it consistently for all
username references, or not at all.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian <pgman@candle.pha.pa.us> writes:
I dislike double-testing the username in schema areas but not other
places. Seems if we do it, we should do it consistently for all
username references, or not at all.
What other places do we have an explicit dependence on the username?
regards, tom lane
Tom Lane wrote:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
I dislike double-testing the username in schema areas but not other
places. Seems if we do it, we should do it consistently for all
username references, or not at all.What other places do we have an explicit dependence on the username?
Uh, what about CREATE/ALTER/DROP USER, and pg_hba.conf. Of course,
those are more admin, but isn't the schema also sort of admin too?
I am also concerned about opening cases where a CURRENT_USER test
doesn't match the user's schema.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073