Logo Search packages:      
Sourcecode: postgresql-8.4 version File versions  Download package

pseudotypes.c
/*-------------------------------------------------------------------------
 *
 * pseudotypes.c
 *      Functions for the system pseudo-types.
 *
 * A pseudo-type isn't really a type and never has any operations, but
 * we do need to supply input and output functions to satisfy the links
 * in the pseudo-type's entry in pg_type.  In most cases the functions
 * just throw an error if invoked.  (XXX the error messages here cover
 * the most common case, but might be confusing in some contexts.  Can
 * we do better?)
 *
 *
 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *      $PostgreSQL: pgsql/src/backend/utils/adt/pseudotypes.c,v 1.22 2009/01/01 17:23:49 momjian Exp $
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"

#include "libpq/pqformat.h"
#include "utils/array.h"
#include "utils/builtins.h"


/*
 * cstring_in           - input routine for pseudo-type CSTRING.
 *
 * We might as well allow this to support constructs like "foo_in('blah')".
 */
Datum
cstring_in(PG_FUNCTION_ARGS)
{
      char     *str = PG_GETARG_CSTRING(0);

      PG_RETURN_CSTRING(pstrdup(str));
}

/*
 * cstring_out          - output routine for pseudo-type CSTRING.
 *
 * We allow this mainly so that "SELECT some_output_function(...)" does
 * what the user will expect.
 */
Datum
cstring_out(PG_FUNCTION_ARGS)
{
      char     *str = PG_GETARG_CSTRING(0);

      PG_RETURN_CSTRING(pstrdup(str));
}

/*
 * cstring_recv         - binary input routine for pseudo-type CSTRING.
 */
Datum
cstring_recv(PG_FUNCTION_ARGS)
{
      StringInfo  buf = (StringInfo) PG_GETARG_POINTER(0);
      char     *str;
      int               nbytes;

      str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
      PG_RETURN_CSTRING(str);
}

/*
 * cstring_send         - binary output routine for pseudo-type CSTRING.
 */
Datum
cstring_send(PG_FUNCTION_ARGS)
{
      char     *str = PG_GETARG_CSTRING(0);
      StringInfoData buf;

      pq_begintypsend(&buf);
      pq_sendtext(&buf, str, strlen(str));
      PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}


/*
 * any_in         - input routine for pseudo-type ANY.
 */
Datum
any_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type any")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * any_out        - output routine for pseudo-type ANY.
 */
Datum
any_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type any")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}


/*
 * anyarray_in          - input routine for pseudo-type ANYARRAY.
 */
Datum
anyarray_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type anyarray")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anyarray_out         - output routine for pseudo-type ANYARRAY.
 *
 * We may as well allow this, since array_out will in fact work.
 */
Datum
anyarray_out(PG_FUNCTION_ARGS)
{
      return array_out(fcinfo);
}

/*
 * anyarray_recv        - binary input routine for pseudo-type ANYARRAY.
 *
 * XXX this could actually be made to work, since the incoming array
 * data will contain the element type OID.      Need to think through
 * type-safety issues before allowing it, however.
 */
Datum
anyarray_recv(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type anyarray")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anyarray_send        - binary output routine for pseudo-type ANYARRAY.
 *
 * We may as well allow this, since array_send will in fact work.
 */
Datum
anyarray_send(PG_FUNCTION_ARGS)
{
      return array_send(fcinfo);
}


/*
 * anyenum_in           - input routine for pseudo-type ANYENUM.
 */
Datum
anyenum_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type anyenum")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anyenum_out          - output routine for pseudo-type ANYENUM.
 *
 * We may as well allow this, since enum_out will in fact work.
 */
Datum
anyenum_out(PG_FUNCTION_ARGS)
{
      return enum_out(fcinfo);
}


/*
 * void_in        - input routine for pseudo-type VOID.
 *
 * We allow this so that PL functions can return VOID without any special
 * hack in the PL handler.    Whatever value the PL thinks it's returning
 * will just be ignored.
 */
Datum
void_in(PG_FUNCTION_ARGS)
{
      PG_RETURN_VOID();             /* you were expecting something different? */
}

/*
 * void_out       - output routine for pseudo-type VOID.
 *
 * We allow this so that "SELECT function_returning_void(...)" works.
 */
Datum
void_out(PG_FUNCTION_ARGS)
{
      PG_RETURN_CSTRING(pstrdup(""));
}


/*
 * trigger_in           - input routine for pseudo-type TRIGGER.
 */
Datum
trigger_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type trigger")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * trigger_out          - output routine for pseudo-type TRIGGER.
 */
Datum
trigger_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type trigger")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}


/*
 * language_handler_in        - input routine for pseudo-type LANGUAGE_HANDLER.
 */
Datum
language_handler_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type language_handler")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * language_handler_out       - output routine for pseudo-type LANGUAGE_HANDLER.
 */
Datum
language_handler_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type language_handler")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}


/*
 * internal_in          - input routine for pseudo-type INTERNAL.
 */
Datum
internal_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type internal")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * internal_out         - output routine for pseudo-type INTERNAL.
 */
Datum
internal_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type internal")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}


/*
 * opaque_in            - input routine for pseudo-type OPAQUE.
 */
Datum
opaque_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type opaque")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * opaque_out           - output routine for pseudo-type OPAQUE.
 */
Datum
opaque_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type opaque")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}


/*
 * anyelement_in        - input routine for pseudo-type ANYELEMENT.
 */
Datum
anyelement_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type anyelement")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anyelement_out       - output routine for pseudo-type ANYELEMENT.
 */
Datum
anyelement_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type anyelement")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anynonarray_in       - input routine for pseudo-type ANYNONARRAY.
 */
Datum
anynonarray_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of type anynonarray")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * anynonarray_out            - output routine for pseudo-type ANYNONARRAY.
 */
Datum
anynonarray_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of type anynonarray")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * shell_in       - input routine for "shell" types (those not yet filled in).
 */
Datum
shell_in(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot accept a value of a shell type")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

/*
 * shell_out            - output routine for "shell" types.
 */
Datum
shell_out(PG_FUNCTION_ARGS)
{
      ereport(ERROR,
                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                   errmsg("cannot display a value of a shell type")));

      PG_RETURN_VOID();             /* keep compiler quiet */
}

Generated by  Doxygen 1.6.0   Back to index