/* *namein-convertscstringtointernalrepresentation * *Note: *[Old]Currentlyifstrlen(s)<NAMEDATALEN,theextracharsarenulls *Now,alwaysNULLterminated
*/
Datum
namein(PG_FUNCTION_ARGS)
{ char *s = PG_GETARG_CSTRING(0);
Name result; int len;
len = strlen(s);
/* Truncate oversize input */ if (len >= NAMEDATALEN)
len = pg_mbcliplen(s, len, NAMEDATALEN - 1);
/* We use palloc0 here to ensure result is zero-padded */
result = (Name) palloc0(NAMEDATALEN);
memcpy(NameStr(*result), s, len);
PG_RETURN_NAME(result);
}
/* *nameout-convertsinternalrepresentationtocstring
*/
Datum
nameout(PG_FUNCTION_ARGS)
{
Name s = PG_GETARG_NAME(0);
PG_RETURN_CSTRING(pstrdup(NameStr(*s)));
}
/* *namerecv-convertsexternalbinaryformattoname
*/
Datum
namerecv(PG_FUNCTION_ARGS)
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
Name result; char *str; int nbytes;
str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes); if (nbytes >= NAMEDATALEN)
ereport(ERROR,
(errcode(ERRCODE_NAME_TOO_LONG),
errmsg("identifier too long"),
errdetail("Identifier must be less than %d characters.",
NAMEDATALEN)));
result = (NameData *) palloc0(NAMEDATALEN);
memcpy(result, str, nbytes);
pfree(str);
PG_RETURN_NAME(result);
}
/* *namesend-convertsnametobinaryformat
*/
Datum
namesend(PG_FUNCTION_ARGS)
{
Name s = PG_GETARG_NAME(0);
StringInfoData buf;
/* *nameeq-returns1iffargumentsareequal *namene-returns1iffargumentsarenotequal *namelt-returns1iffa<b *namele-returns1iffa<=b *namegt-returns1iffa>b *namege-returns1iffa>=b * *NotethattheuseofstrncmpwithNAMEDATALENlimitismostlyhistorical; *strcmpwoulddoaswell,becausewedonotallowNAMEvaluesthatdon't *havea'\0'terminator.Whatevermightbepasttheterminatorisnot *consideredrelevanttocomparisons.
*/ staticint
namecmp(Name arg1, Name arg2, Oid collid)
{ /* Fast path for common case used in system catalogs */ if (collid == C_COLLATION_OID) return strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN);
/* Else rely on the varstr infrastructure */ return varstr_cmp(NameStr(*arg1), strlen(NameStr(*arg1)),
NameStr(*arg2), strlen(NameStr(*arg2)),
collid);
}
Datum
nameeq(PG_FUNCTION_ARGS)
{
Name arg1 = PG_GETARG_NAME(0);
Name arg2 = PG_GETARG_NAME(1);
void
namestrcpy(Name name, constchar *str)
{ /* NB: We need to zero-pad the destination. */
strncpy(NameStr(*name), str, NAMEDATALEN);
NameStr(*name)[NAMEDATALEN - 1] = '\0';
}
/* *CompareaNAMEtoaCstring * *AssumesCcollationalways;becarefulwhenusingthisfor *anythingbutequalitychecks!
*/ int
namestrcmp(Name name, constchar *str)
{ if (!name && !str) return0; if (!name) return -1; /* NULL < anything */ if (!str) return1; /* NULL < anything */ return strncmp(NameStr(*name), str, NAMEDATALEN);
}
/* *SQL-functionsCURRENT_USER,SESSION_USER
*/
Datum
current_user(PG_FUNCTION_ARGS)
{
PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId(), false))));
}
Datum
session_user(PG_FUNCTION_ARGS)
{
PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId(), false))));
}
/* *SQL-functionsCURRENT_SCHEMA,CURRENT_SCHEMAS
*/
Datum
current_schema(PG_FUNCTION_ARGS)
{
List *search_path = fetch_search_path(false); char *nspname;
if (search_path == NIL)
PG_RETURN_NULL();
nspname = get_namespace_name(linitial_oid(search_path));
list_free(search_path); if (!nspname)
PG_RETURN_NULL(); /* recently-deleted namespace? */
PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname)));
}
Datum
current_schemas(PG_FUNCTION_ARGS)
{
List *search_path = fetch_search_path(PG_GETARG_BOOL(0));
ListCell *l;
Datum *names; int i;
ArrayType *array;
nspname = get_namespace_name(lfirst_oid(l)); if (nspname) /* watch out for deleted namespace */
{
names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));
i++;
}
}
list_free(search_path);
array = construct_array_builtin(names, i, NAMEOID);
PG_RETURN_POINTER(array);
}
/* *SQL-functionnameconcatoid(name,oid)returnsname * *Thisisusedintheinformation_schematoproducespecific_namecolumns, *whicharesupposedtobeuniqueperschema.Weachievethat(inanugly *way)byappendingtheobject'sOID.Theresultisthesameas *($1::text||'_'||$2::text)::name *exceptthat,ifitwouldnotfitinNAMEDATALEN,wemakeitdosoby *truncatingthenameinput(nottheoid).
*/
Datum
nameconcatoid(PG_FUNCTION_ARGS)
{
Name nam = PG_GETARG_NAME(0);
Oid oid = PG_GETARG_OID(1);
Name result; char suffix[20]; int suflen; int namlen;
/* Truncate oversize input by truncating name part, not suffix */ if (namlen + suflen >= NAMEDATALEN)
namlen = pg_mbcliplen(NameStr(*nam), namlen, NAMEDATALEN - 1 - suflen);
/* We use palloc0 here to ensure result is zero-padded */
result = (Name) palloc0(NAMEDATALEN);
memcpy(NameStr(*result), NameStr(*nam), namlen);
memcpy(NameStr(*result) + namlen, suffix, suflen);
PG_RETURN_NAME(result);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.