mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
Require superuser privilege to create a binary-compatible cast, per
discussion some weeks ago. Also, add a check that two types to be binary-equivalenced match as to typlen, typbyval, and typalign; if they don't then it's surely a mistake to equivalence them.
This commit is contained in:
parent
04c57d68ce
commit
d2db166c75
@ -1,4 +1,4 @@
|
|||||||
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.5 2002/09/18 21:35:20 tgl Exp $ -->
|
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.6 2002/10/04 22:08:44 tgl Exp $ -->
|
||||||
|
|
||||||
<refentry id="SQL-CREATECAST">
|
<refentry id="SQL-CREATECAST">
|
||||||
<refmeta>
|
<refmeta>
|
||||||
@ -81,10 +81,9 @@ SELECT 'The time is ' || now();
|
|||||||
</programlisting>
|
</programlisting>
|
||||||
will be allowed only if the cast from type <type>timestamp</> to
|
will be allowed only if the cast from type <type>timestamp</> to
|
||||||
<type>text</type> is marked <literal>AS IMPLICIT</>. Otherwise it
|
<type>text</type> is marked <literal>AS IMPLICIT</>. Otherwise it
|
||||||
will be necessary to write one of
|
will be necessary to write the cast explicitly, for example
|
||||||
<programlisting>
|
<programlisting>
|
||||||
SELECT 'The time is ' || CAST(now() AS text);
|
SELECT 'The time is ' || CAST(now() AS text);
|
||||||
SELECT 'The time is ' || now()::text;
|
|
||||||
</programlisting>
|
</programlisting>
|
||||||
(We generally use the term <firstterm>implicit
|
(We generally use the term <firstterm>implicit
|
||||||
cast</firstterm> to describe this kind of cast.)
|
cast</firstterm> to describe this kind of cast.)
|
||||||
@ -107,7 +106,9 @@ SELECT 'The time is ' || now()::text;
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
To be able to create a cast, you must own the source or the target
|
To be able to create a cast, you must own the source or the target
|
||||||
data type.
|
data type. To create a binary-compatible cast, you must be superuser
|
||||||
|
(this restriction is made because an erroneous binary-compatible cast
|
||||||
|
conversion can easily crash the server).
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<variablelist>
|
<variablelist>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.22 2002/09/21 18:39:25 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.23 2002/10/04 22:08:44 tgl Exp $
|
||||||
*
|
*
|
||||||
* DESCRIPTION
|
* DESCRIPTION
|
||||||
* These routines take the parse tree and pick out the
|
* These routines take the parse tree and pick out the
|
||||||
@ -756,8 +756,35 @@ CreateCast(CreateCastStmt *stmt)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int16 typ1len;
|
||||||
|
int16 typ2len;
|
||||||
|
bool typ1byval;
|
||||||
|
bool typ2byval;
|
||||||
|
char typ1align;
|
||||||
|
char typ2align;
|
||||||
|
|
||||||
/* indicates binary coercibility */
|
/* indicates binary coercibility */
|
||||||
funcid = InvalidOid;
|
funcid = InvalidOid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Must be superuser to create binary-compatible casts, since
|
||||||
|
* erroneous casts can easily crash the backend.
|
||||||
|
*/
|
||||||
|
if (!superuser())
|
||||||
|
elog(ERROR, "Must be superuser to create a cast WITHOUT FUNCTION");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Also, insist that the types match as to size, alignment, and
|
||||||
|
* pass-by-value attributes; this provides at least a crude check
|
||||||
|
* that they have similar representations. A pair of types that
|
||||||
|
* fail this test should certainly not be equated.
|
||||||
|
*/
|
||||||
|
get_typlenbyvalalign(sourcetypeid, &typ1len, &typ1byval, &typ1align);
|
||||||
|
get_typlenbyvalalign(targettypeid, &typ2len, &typ2byval, &typ2align);
|
||||||
|
if (typ1len != typ2len ||
|
||||||
|
typ1byval != typ2byval ||
|
||||||
|
typ1align != typ2align)
|
||||||
|
elog(ERROR, "source and target datatypes are not physically compatible");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert CoercionContext enum to char value for castcontext */
|
/* convert CoercionContext enum to char value for castcontext */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user