create_cast man page on SuSE

Man page or keyword search:  
man Server   14857 pages
apropos Keyword Search (all sections)
Output format
SuSE logo
[printable version]

CREATE CAST()			 SQL Commands			 CREATE CAST()

NAME
       CREATE CAST - define a new cast

SYNOPSIS
       CREATE CAST (sourcetype AS targettype)
	   WITH FUNCTION funcname (argtypes)
	   [ AS ASSIGNMENT | AS IMPLICIT ]

       CREATE CAST (sourcetype AS targettype)
	   WITHOUT FUNCTION
	   [ AS ASSIGNMENT | AS IMPLICIT ]

DESCRIPTION
       CREATE  CAST defines a new cast. A cast specifies how to perform a con‐
       version between two data types. For example:

       SELECT CAST(42 AS float8);

       converts the integer constant 42 to type float8 by  invoking  a	previ‐
       ously  specified	 function,  in this case float8(int4). (If no suitable
       cast has been defined, the conversion fails.)

       Two types can be binary compatible, which means that they can  be  con‐
       verted  into  one  another  ``for free'' without invoking any function.
       This requires that corresponding values use the same internal represen‐
       tation. For instance, the types text and varchar are binary compatible.

       By  default,  a	cast  can be invoked only by an explicit cast request,
       that is an explicit CAST(x AS typename) or x::typename construct.

       If the cast is marked AS ASSIGNMENT then it can be  invoked  implicitly
       when  assigning a value to a column of the target data type.  For exam‐
       ple, supposing that foo.f1 is a column of type text, then:

       INSERT INTO foo (f1) VALUES (42);

       will be allowed if the cast from type integer to type text is marked AS
       ASSIGNMENT,  otherwise not.  (We generally use the term assignment cast
       to describe this kind of cast.)

       If the cast is marked AS IMPLICIT then it can be invoked implicitly  in
       any  context,  whether  assignment  or internally in an expression. (We
       generally use the term implicit cast to describe this  kind  of	cast.)
       For example, consider this query:

       SELECT 2 + 4.0;

       The  parser  initially marks the constants as being of type integer and
       numeric respectively. There is no integer +  numeric  operator  in  the
       system  catalogs, but there is a numeric + numeric operator.  The query
       will therefore succeed if a cast from integer to numeric	 is  available
       and  is marked AS IMPLICIT — which in fact it is. The parser will apply
       the implicit cast and resolve the query as if it had been written

       SELECT CAST ( 2 AS numeric ) + 4.0;

       Now, the catalogs also provide a cast from numeric to integer. If  that
       cast  were marked AS IMPLICIT — which it is not — then the parser would
       be faced with choosing between the above interpretation and the	alter‐
       native  of  casting  the	 numeric  constant to integer and applying the
       integer + integer operator. Lacking any knowledge of  which  choice  to
       prefer, it would give up and declare the query ambiguous. The fact that
       only one of the two casts is implicit is the way in which we teach  the
       parser  to  prefer resolution of a mixed numeric-and-integer expression
       as numeric; there is no built-in knowledge about that.

       It is wise to be conservative about marking casts as implicit. An over‐
       abundance of implicit casting paths can cause PostgreSQL to choose sur‐
       prising interpretations of commands, or to be unable  to	 resolve  com‐
       mands  at  all  because	there are multiple possible interpretations. A
       good rule of thumb is to make a	cast  implicitly  invokable  only  for
       information-preserving  transformations	between types in the same gen‐
       eral type category. For example, the cast from int2 to int4 can reason‐
       ably  be	 implicit, but the cast from float8 to int4 should probably be
       assignment-only. Cross-type-category casts, such as text to  int4,  are
       best made explicit-only.

       To be able to create a cast, you must own the source or the target data
       type. To create a binary-compatible cast, you must be superuser.	 (This
       restriction is made because an erroneous binary-compatible cast conver‐
       sion can easily crash the server.)

PARAMETERS
       sourcetype
	      The name of the source data type of the cast.

       targettype
	      The name of the target data type of the cast.

       funcname(argtypes)
	      The function used to perform the cast. The function name can  be
	      schema-qualified.	 If  it is not, the function will be looked up
	      in the schema search path. The function's result data type  must
	      match  the  target type of the cast. Its arguments are discussed
	      below.

       WITHOUT FUNCTION
	      Indicates that the source type and the target  type  are	binary
	      compatible, so no function is required to perform the cast.

       AS ASSIGNMENT
	      Indicates	 that the cast can be invoked implicitly in assignment
	      contexts.

       AS IMPLICIT
	      Indicates that the cast can be invoked implicitly	 in  any  con‐
	      text.

       Cast  implementation  functions	can  have one to three arguments.  The
       first argument type must be identical to the cast's source  type.   The
       second argument, if present, must be type integer; it receives the type
       modifier associated with the destination type, or -1 if there is	 none.
       The  third argument, if present, must be type boolean; it receives true
       if the cast is an explicit cast, false otherwise.  (Bizarrely, the  SQL
       spec  demands  different	 behaviors  for explicit and implicit casts in
       some cases. This argument is supplied for functions that must implement
       such  casts.  It is not recommended that you design your own data types
       so that this matters.)

       Ordinarily a cast must have different source  and  target  data	types.
       However, it is allowed to declare a cast with identical source and tar‐
       get types if it has a cast implementation function with more  than  one
       argument. This is used to represent type-specific length coercion func‐
       tions in the system catalogs. The named function is used	 to  coerce  a
       value  of the type to the type modifier value given by its second argu‐
       ment.

       When a cast has different source and target types and a	function  that
       takes more than one argument, it represents converting from one type to
       another and applying a length coercion in a single step. When  no  such
       entry  is  available,  coercion	to  a  type  that uses a type modifier
       involves two steps, one to convert between data types and a  second  to
       apply the modifier.

NOTES
       Use DROP CAST [drop_cast(7)] to remove user-defined casts.

       Remember	 that  if  you	want to be able to convert types both ways you
       need to declare casts both ways explicitly.

       It is normally not necessary to create casts between user-defined types
       and  the standard string types (text, varchar, and char(n)). PostgreSQL
       will automatically handle a cast to a string type by invoking the other
       type's  output function, or conversely handle a cast from a string type
       by invoking the other type's input function.  These  automatically-pro‐
       vided  casts are known as I/O conversion casts. I/O conversion casts to
       string types are treated as  assignment	casts,	while  I/O  conversion
       casts from string types are explicit-only. You can override this behav‐
       ior by declaring your own cast to replace an I/O conversion  cast,  but
       usually	the  only  reason to do so is if you want the conversion to be
       more easily invokable than the standard	assignment-only	 or  explicit-
       only  setting.  Another possible reason is that you want the conversion
       to behave differently from the type's I/O function; but that is	suffi‐
       ciently	surprising  that  you  should think twice about whether it's a
       good idea. (A small number of the built-in types do indeed have differ‐
       ent  behaviors  for  conversions, mostly because of requirements of the
       SQL standard.)

       Prior to PostgreSQL 7.3, every function that had the  same  name	 as  a
       data  type, returned that data type, and took one argument of a differ‐
       ent type was automatically a cast function.  This convention  has  been
       abandoned in face of the introduction of schemas and to be able to rep‐
       resent binary compatible casts in the  system  catalogs.	 The  built-in
       cast  functions	still  follow  this naming scheme, but they have to be
       shown as casts in the system catalog pg_cast as well.

       While not required, it is recommended that you continue to follow  this
       old convention of naming cast implementation functions after the target
       data type. Many users are used to being able to cast data types using a
       function-style  notation, that is typename(x). This notation is in fact
       nothing more nor less than a call of the cast implementation  function;
       it is not specially treated as a cast. If your conversion functions are
       not named to support this  convention  then  you	 will  have  surprised
       users.	Since  PostgreSQL allows overloading of the same function name
       with different argument types, there is no difficulty in having	multi‐
       ple  conversion	functions from different types that all use the target
       type's name.

	      Note: Actually the preceding paragraph is an oversimplification:
	      there  are  two cases in which a function-call construct will be
	      treated as a cast request without having matched it to an actual
	      function.	 If a function call name(x) does not exactly match any
	      existing function, but name is the  name	of  a  data  type  and
	      pg_cast  provides a binary-compatible cast to this type from the
	      type of x, then the call will be construed as a  binary-compati‐
	      ble cast. This exception is made so that binary-compatible casts
	      can be invoked using functional syntax, even  though  they  lack
	      any  function.  Likewise,	 if  there is no pg_cast entry but the
	      cast would be to or from a string type, the call	will  be  con‐
	      strued as an I/O conversion cast. This exception allows I/O con‐
	      version casts to be invoked using functional syntax.

EXAMPLES
       To create a cast from type bigint  to  type  int4  using	 the  function
       int4(bigint):

       CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint);

       (This cast is already predefined in the system.)

COMPATIBILITY
       The  CREATE  CAST command conforms to the SQL standard, except that SQL
       does not make provisions for binary-compatible types or extra arguments
       to  implementation  functions.	AS IMPLICIT is a PostgreSQL extension,
       too.

SEE ALSO
       CREATE FUNCTION	[create_function(7)],  CREATE  TYPE  [create_type(7)],
       DROP CAST [drop_cast(7)]

SQL - Language Statements	  2013-02-04			 CREATE CAST()
[top]

List of man pages available for SuSE

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net