Re: PLPGSQL OID Bug - Mailing list pgsql-patches

From Neil Conway
Subject Re: PLPGSQL OID Bug
Date
Msg-id 42E87271.4090202@samurai.com
Whole thread Raw
In response to Re: PLPGSQL OID Bug  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: PLPGSQL OID Bug
List pgsql-patches
Tom Lane wrote:
> I think the reason is that it's both an input and an output parameter,
> to handle the case where the cast function returns NULL.

The only reference to `isnull' in the body of exec_cast_value() is:

if (!*isnull)
{
     /* ... */
}

i.e. it is never referenced again, let alone written through. Barring
any objections I'll apply the attached patch tomorrow.

-Neil
Index: src/pl/plpgsql/src/pl_exec.c
===================================================================
RCS file: /var/lib/cvs/pgsql/src/pl/plpgsql/src/pl_exec.c,v
retrieving revision 1.150
diff -c -r1.150 pl_exec.c
*** src/pl/plpgsql/src/pl_exec.c    28 Jul 2005 00:26:30 -0000    1.150
--- src/pl/plpgsql/src/pl_exec.c    28 Jul 2005 05:29:21 -0000
***************
*** 173,182 ****
                  FmgrInfo *reqinput,
                  Oid reqtypioparam,
                  int32 reqtypmod,
!                 bool *isnull);
  static Datum exec_simple_cast_value(Datum value, Oid valtype,
                         Oid reqtype, int32 reqtypmod,
!                        bool *isnull);
  static void exec_init_tuple_store(PLpgSQL_execstate *estate);
  static bool compatible_tupdesc(TupleDesc td1, TupleDesc td2);
  static void exec_set_found(PLpgSQL_execstate *estate, bool state);
--- 173,182 ----
                  FmgrInfo *reqinput,
                  Oid reqtypioparam,
                  int32 reqtypmod,
!                 bool isnull);
  static Datum exec_simple_cast_value(Datum value, Oid valtype,
                         Oid reqtype, int32 reqtypmod,
!                        bool isnull);
  static void exec_init_tuple_store(PLpgSQL_execstate *estate);
  static bool compatible_tupdesc(TupleDesc td1, TupleDesc td2);
  static void exec_set_found(PLpgSQL_execstate *estate, bool state);
***************
*** 356,362 ****
                                              &(func->fn_retinput),
                                              func->fn_rettypioparam,
                                              -1,
!                                             &fcinfo->isnull);

              /*
               * If the function's return type isn't by value, copy the value
--- 356,362 ----
                                              &(func->fn_retinput),
                                              func->fn_rettypioparam,
                                              -1,
!                                             fcinfo->isnull);

              /*
               * If the function's return type isn't by value, copy the value
***************
*** 1348,1354 ****
      value = exec_cast_value(value, valtype, var->datatype->typoid,
                              &(var->datatype->typinput),
                              var->datatype->typioparam,
!                             var->datatype->atttypmod, &isnull);
      if (isnull)
          ereport(ERROR,
                  (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
--- 1348,1354 ----
      value = exec_cast_value(value, valtype, var->datatype->typoid,
                              &(var->datatype->typinput),
                              var->datatype->typioparam,
!                             var->datatype->atttypmod, isnull);
      if (isnull)
          ereport(ERROR,
                  (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
***************
*** 1364,1370 ****
      value = exec_cast_value(value, valtype, var->datatype->typoid,
                              &(var->datatype->typinput),
                              var->datatype->typioparam,
!                             var->datatype->atttypmod, &isnull);
      if (isnull)
          ereport(ERROR,
                  (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
--- 1364,1370 ----
      value = exec_cast_value(value, valtype, var->datatype->typoid,
                              &(var->datatype->typinput),
                              var->datatype->typioparam,
!                             var->datatype->atttypmod, isnull);
      if (isnull)
          ereport(ERROR,
                  (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
***************
*** 1868,1874 ****
                                                  var->datatype->typoid,
                                                  tupdesc->attrs[0]->atttypid,
                                                  tupdesc->attrs[0]->atttypmod,
!                                                 &isNull);

                  tuple = heap_form_tuple(tupdesc, &retval, &isNull);

--- 1868,1874 ----
                                                  var->datatype->typoid,
                                                  tupdesc->attrs[0]->atttypid,
                                                  tupdesc->attrs[0]->atttypmod,
!                                                 isNull);

                  tuple = heap_form_tuple(tupdesc, &retval, &isNull);

***************
*** 1934,1940 ****
                                          rettype,
                                          tupdesc->attrs[0]->atttypid,
                                          tupdesc->attrs[0]->atttypmod,
!                                         &isNull);

          tuple = heap_form_tuple(tupdesc, &retval, &isNull);

--- 1934,1940 ----
                                          rettype,
                                          tupdesc->attrs[0]->atttypid,
                                          tupdesc->attrs[0]->atttypmod,
!                                         isNull);

          tuple = heap_form_tuple(tupdesc, &retval, &isNull);

***************
*** 2995,3001 ****
                                             &(var->datatype->typinput),
                                             var->datatype->typioparam,
                                             var->datatype->atttypmod,
!                                            isNull);

                  if (*isNull && var->notnull)
                      ereport(ERROR,
--- 2995,3001 ----
                                             &(var->datatype->typinput),
                                             var->datatype->typioparam,
                                             var->datatype->atttypmod,
!                                            *isNull);

                  if (*isNull && var->notnull)
                      ereport(ERROR,
***************
*** 3194,3200 ****
                                                       valtype,
                                                       atttype,
                                                       atttypmod,
!                                                      &attisnull);
                  if (attisnull)
                      nulls[fno] = 'n';
                  else
--- 3194,3200 ----
                                                       valtype,
                                                       atttype,
                                                       atttypmod,
!                                                      attisnull);
                  if (attisnull)
                      nulls[fno] = 'n';
                  else
***************
*** 3340,3346 ****
                                                         valtype,
                                                         arrayelemtypeid,
                                                         -1,
!                                                        isNull);

                  /*
                   * Build the modified array value.
--- 3340,3346 ----
                                                         valtype,
                                                         arrayelemtypeid,
                                                         -1,
!                                                        *isNull);

                  /*
                   * Build the modified array value.
***************
*** 3564,3570 ****
      exprdatum = exec_eval_expr(estate, expr, isNull, &exprtypeid);
      exprdatum = exec_simple_cast_value(exprdatum, exprtypeid,
                                         INT4OID, -1,
!                                        isNull);
      return DatumGetInt32(exprdatum);
  }

--- 3564,3570 ----
      exprdatum = exec_eval_expr(estate, expr, isNull, &exprtypeid);
      exprdatum = exec_simple_cast_value(exprdatum, exprtypeid,
                                         INT4OID, -1,
!                                        *isNull);
      return DatumGetInt32(exprdatum);
  }

***************
*** 3586,3592 ****
      exprdatum = exec_eval_expr(estate, expr, isNull, &exprtypeid);
      exprdatum = exec_simple_cast_value(exprdatum, exprtypeid,
                                         BOOLOID, -1,
!                                        isNull);
      return DatumGetBool(exprdatum);
  }

--- 3586,3592 ----
      exprdatum = exec_eval_expr(estate, expr, isNull, &exprtypeid);
      exprdatum = exec_simple_cast_value(exprdatum, exprtypeid,
                                         BOOLOID, -1,
!                                        *isNull);
      return DatumGetBool(exprdatum);
  }

***************
*** 4060,4068 ****
                  FmgrInfo *reqinput,
                  Oid reqtypioparam,
                  int32 reqtypmod,
!                 bool *isnull)
  {
!     if (!*isnull)
      {
          /*
           * If the type of the queries return value isn't that of the
--- 4060,4068 ----
                  FmgrInfo *reqinput,
                  Oid reqtypioparam,
                  int32 reqtypmod,
!                 bool isnull)
  {
!     if (!isnull)
      {
          /*
           * If the type of the queries return value isn't that of the
***************
*** 4095,4103 ****
  static Datum
  exec_simple_cast_value(Datum value, Oid valtype,
                         Oid reqtype, int32 reqtypmod,
!                        bool *isnull)
  {
!     if (!*isnull)
      {
          if (valtype != reqtype || reqtypmod != -1)
          {
--- 4095,4103 ----
  static Datum
  exec_simple_cast_value(Datum value, Oid valtype,
                         Oid reqtype, int32 reqtypmod,
!                        bool isnull)
  {
!     if (!isnull)
      {
          if (valtype != reqtype || reqtypmod != -1)
          {

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: AIX - pgport/contrib resolution
Next
From: Gavin Sherry
Date:
Subject: Re: [HACKERS] Duplicate object names in GRANT