Re: Converting empty input strings to Nulls

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: Converting empty input strings to Nulls
Дата
Msg-id 162867790805311135y1087b472uc1ac8f6f8371455b@mail.gmail.com
обсуждение исходный текст
Ответ на Converting empty input strings to Nulls  ("Ken Winter" <ken@sunward.org>)
Ответы Re: Converting empty input strings to Nulls
Список pgsql-general
Hello

2008/5/31 Ken Winter <ken@sunward.org>:
> Applications accessing my PostgreSQL 8.0 database like to submit no-value
> date column values as empty strings rather than as Nulls.  This, of course,
> causes this PG error:
>
> SQL State: 22007
> ERROR: invalid input syntax for type date: ""
>
> I'm looking for a way to trap this bad input at the database level, quietly
> convert the input empty strings to Null, and store the Null in the date
> column.  I tried a BEFORE INSERT OR UPDATE trigger evoking this function ...
>
> CREATE OR REPLACE FUNCTION "public"."empty_string_to_null"()
> RETURNS trigger AS
> $BODY$
> BEGIN
>    IF CAST(NEW.birth_date AS text) = '' THEN
>        NEW.birth_date = Null;
>    END IF;
>    RETURN NEW;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE;
>
> ... but an empty string still evokes the error even before this function is
> triggered.
>
> Is there a way to convert empty strings to Nulls before the error is evoked?
>
no - it's not possible. And some "magic" fix in triggers is bad style.

you can write own custom type (not in plpgsql) that allows this
behave. You can copy and modify postgre's DateADT implementation.
pgsql/src/backend/utils/adt/date.c

Datum
date_in(PG_FUNCTION_ARGS)
{
        char       *str = PG_GETARG_CSTRING(0);
        DateADT         date;
        fsec_t          fsec;
        struct pg_tm tt,
                           *tm = &tt;
        int                     tzp;
        int                     dtype;
        int                     nf;
        int                     dterr;
        char       *field[MAXDATEFIELDS];
        int                     ftype[MAXDATEFIELDS];
        char            workbuf[MAXDATELEN + 1];

// your hack
if (strlen(str) == 0)
   PG_RETURN_NULL();

        dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
                                                  field, ftype,
MAXDATEFIELDS, &n
        if (dterr == 0)
                dterr = DecodeDateTime(field, ftype, nf, &dtype, tm,
&fsec, &tzp)
        if (dterr != 0)
                DateTimeParseError(dterr, str, "date");

        switch (dtype)




more: http://www.postgresql.org/docs/8.3/interactive/xtypes.html

I am not sure if in function can return NULL.You should to test it

regards
Pavel Stehule



> ~ TIA
> ~ Ken
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

В списке pgsql-general по дате отправления:

Предыдущее
От: "Ken Winter"
Дата:
Сообщение: Converting empty input strings to Nulls
Следующее
От: Craig Ringer
Дата:
Сообщение: Re: Converting empty input strings to Nulls