Re: [HACKERS] Implementation of SQLCODE and SQLERRM variables

Поиск
Список
Период
Сортировка
От Neil Conway
Тема Re: [HACKERS] Implementation of SQLCODE and SQLERRM variables
Дата
Msg-id 422CD3EE.9060202@samurai.com
обсуждение исходный текст
Ответ на Re: [HACKERS] Implementation of SQLCODE and SQLERRM variables for  (Pavel Stehule <stehule@kix.fsv.cvut.cz>)
Ответы Re: [HACKERS] Implementation of SQLCODE and SQLERRM variables for
Список pgsql-patches
- You should write some regression tests for this functionality

- You should update the documentation

- Is there a reason why you've made the type of SQLCODE `text', rather
than integer?

Pavel Stehule wrote:
> + fict_vars_sect            :
> +                      {
> +                             plpgsql_ns_setlocal(false);
> +                          PLpgSQL_variable    *var;
> +                         var = plpgsql_build_variable(strdup("sqlcode"), 0,
> +                                           plpgsql_build_datatype(TEXTOID, -1), true);
> +                          $$.sqlcode_varno = var->dno;
> +                         var = plpgsql_build_variable(strdup("sqlerrm"), 0,
> +                                           plpgsql_build_datatype(TEXTOID, -1), true);

This shouldn't be strdup'ing its first argument (and even if it needed
to make a copy, it should use pstrdup). Also, my personal preference
would be to implement this without creating a new production (i.e. just
include it inline in the body of the pl_block production).

> *** src.old/pl_exec.c    2005-02-24 02:11:40.000000000 +0100
> --- src/pl_exec.c    2005-03-07 09:53:52.630243888 +0100
> ***************
> *** 809,814 ****
> --- 809,828 ----
>       int            i;
>       int            n;
>
> +      /* setup SQLCODE and SQLERRM */
> +      PLpgSQL_var *var;
> +
> +      var = (PLpgSQL_var *) (estate->datums[block->sqlcode_varno]);
> +      var->isnull = false;
> +      var->freeval = false;
> +      var->value = DirectFunctionCall1(textin, CStringGetDatum("00000"));
> +
> +      var = (PLpgSQL_var *) (estate->datums[block->sqlerrm_varno]);
> +       var->isnull = false;
> +      var->freeval = false;
> +      var->value = DirectFunctionCall1(textin, CStringGetDatum("Sucessful completion"));

`freeval' should be true, no? (Not sure it actually matters, but text is
certainly not pass-by-value).

> ***************
> *** 918,923 ****
> --- 932,957 ----
[...]
> +              var = (PLpgSQL_var *) (estate->datums[block->sqlcode_varno]);
> +              var->value = DirectFunctionCall1(textin, CStringGetDatum(tbuf));
> +
> +              var = (PLpgSQL_var *) (estate->datums[block->sqlerrm_varno]);
> +              var->value = DirectFunctionCall1(textin, CStringGetDatum(edata->message));

You should probably pfree() the old values before replacing them.

-Neil

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

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: [INTERFACES] bcc32.mak for libpq broken? (distro 8.0.0)
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] Implementation of SQLCODE and SQLERRM variables for