Thread: bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings with dropped cols

bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings with dropped cols

From
Joe Conway
Date:
I discovered that TupleDescGetAttInMetadata and BuildTupleFromCStrings
don't deal well with tuples having dropped columns. The attached fixes
the issue. Please apply.

Thanks,

Joe
Index: src/backend/executor/execTuples.c
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/backend/executor/execTuples.c,v
retrieving revision 1.71
diff -c -r1.71 execTuples.c
*** src/backend/executor/execTuples.c    8 Aug 2003 21:41:40 -0000    1.71
--- src/backend/executor/execTuples.c    21 Sep 2003 23:23:02 -0000
***************
*** 674,689 ****
       * Gather info needed later to call the "in" function for each
       * attribute
       */
!     attinfuncinfo = (FmgrInfo *) palloc(natts * sizeof(FmgrInfo));
!     attelems = (Oid *) palloc(natts * sizeof(Oid));
!     atttypmods = (int32 *) palloc(natts * sizeof(int32));

      for (i = 0; i < natts; i++)
      {
!         atttypeid = tupdesc->attrs[i]->atttypid;
!         getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
!         fmgr_info(attinfuncid, &attinfuncinfo[i]);
!         atttypmods[i] = tupdesc->attrs[i]->atttypmod;
      }
      attinmeta->tupdesc = tupdesc;
      attinmeta->attinfuncs = attinfuncinfo;
--- 674,693 ----
       * Gather info needed later to call the "in" function for each
       * attribute
       */
!     attinfuncinfo = (FmgrInfo *) palloc0(natts * sizeof(FmgrInfo));
!     attelems = (Oid *) palloc0(natts * sizeof(Oid));
!     atttypmods = (int32 *) palloc0(natts * sizeof(int32));

      for (i = 0; i < natts; i++)
      {
!         /* Ignore dropped attributes */
!         if (!tupdesc->attrs[i]->attisdropped)
!         {
!             atttypeid = tupdesc->attrs[i]->atttypid;
!             getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
!             fmgr_info(attinfuncid, &attinfuncinfo[i]);
!             atttypmods[i] = tupdesc->attrs[i]->atttypmod;
!         }
      }
      attinmeta->tupdesc = tupdesc;
      attinmeta->attinfuncs = attinfuncinfo;
***************
*** 712,733 ****
      dvalues = (Datum *) palloc(natts * sizeof(Datum));
      nulls = (char *) palloc(natts * sizeof(char));

!     /* Call the "in" function for each non-null attribute */
      for (i = 0; i < natts; i++)
      {
!         if (values[i] != NULL)
          {
!             attelem = attinmeta->attelems[i];
!             atttypmod = attinmeta->atttypmods[i];
!
!             dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
!                                        CStringGetDatum(values[i]),
!                                        ObjectIdGetDatum(attelem),
!                                        Int32GetDatum(atttypmod));
!             nulls[i] = ' ';
          }
          else
          {
              dvalues[i] = (Datum) 0;
              nulls[i] = 'n';
          }
--- 716,747 ----
      dvalues = (Datum *) palloc(natts * sizeof(Datum));
      nulls = (char *) palloc(natts * sizeof(char));

!     /* Call the "in" function for each non-null, non-dropped attribute */
      for (i = 0; i < natts; i++)
      {
!         if (!tupdesc->attrs[i]->attisdropped)
          {
!             /* Non-dropped attributes */
!             if (values[i] != NULL)
!             {
!                 attelem = attinmeta->attelems[i];
!                 atttypmod = attinmeta->atttypmods[i];
!
!                 dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
!                                            CStringGetDatum(values[i]),
!                                            ObjectIdGetDatum(attelem),
!                                            Int32GetDatum(atttypmod));
!                 nulls[i] = ' ';
!             }
!             else
!             {
!                 dvalues[i] = (Datum) 0;
!                 nulls[i] = 'n';
!             }
          }
          else
          {
+             /* Handle dropped attributes by setting to NULL */
              dvalues[i] = (Datum) 0;
              nulls[i] = 'n';
          }

Re: bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings

From
Bruce Momjian
Date:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Joe Conway wrote:
> I discovered that TupleDescGetAttInMetadata and BuildTupleFromCStrings
> don't deal well with tuples having dropped columns. The attached fixes
> the issue. Please apply.
>
> Thanks,
>
> Joe

> Index: src/backend/executor/execTuples.c
> ===================================================================
> RCS file: /opt/src/cvs/pgsql-server/src/backend/executor/execTuples.c,v
> retrieving revision 1.71
> diff -c -r1.71 execTuples.c
> *** src/backend/executor/execTuples.c    8 Aug 2003 21:41:40 -0000    1.71
> --- src/backend/executor/execTuples.c    21 Sep 2003 23:23:02 -0000
> ***************
> *** 674,689 ****
>        * Gather info needed later to call the "in" function for each
>        * attribute
>        */
> !     attinfuncinfo = (FmgrInfo *) palloc(natts * sizeof(FmgrInfo));
> !     attelems = (Oid *) palloc(natts * sizeof(Oid));
> !     atttypmods = (int32 *) palloc(natts * sizeof(int32));
>
>       for (i = 0; i < natts; i++)
>       {
> !         atttypeid = tupdesc->attrs[i]->atttypid;
> !         getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
> !         fmgr_info(attinfuncid, &attinfuncinfo[i]);
> !         atttypmods[i] = tupdesc->attrs[i]->atttypmod;
>       }
>       attinmeta->tupdesc = tupdesc;
>       attinmeta->attinfuncs = attinfuncinfo;
> --- 674,693 ----
>        * Gather info needed later to call the "in" function for each
>        * attribute
>        */
> !     attinfuncinfo = (FmgrInfo *) palloc0(natts * sizeof(FmgrInfo));
> !     attelems = (Oid *) palloc0(natts * sizeof(Oid));
> !     atttypmods = (int32 *) palloc0(natts * sizeof(int32));
>
>       for (i = 0; i < natts; i++)
>       {
> !         /* Ignore dropped attributes */
> !         if (!tupdesc->attrs[i]->attisdropped)
> !         {
> !             atttypeid = tupdesc->attrs[i]->atttypid;
> !             getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
> !             fmgr_info(attinfuncid, &attinfuncinfo[i]);
> !             atttypmods[i] = tupdesc->attrs[i]->atttypmod;
> !         }
>       }
>       attinmeta->tupdesc = tupdesc;
>       attinmeta->attinfuncs = attinfuncinfo;
> ***************
> *** 712,733 ****
>       dvalues = (Datum *) palloc(natts * sizeof(Datum));
>       nulls = (char *) palloc(natts * sizeof(char));
>
> !     /* Call the "in" function for each non-null attribute */
>       for (i = 0; i < natts; i++)
>       {
> !         if (values[i] != NULL)
>           {
> !             attelem = attinmeta->attelems[i];
> !             atttypmod = attinmeta->atttypmods[i];
> !
> !             dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
> !                                        CStringGetDatum(values[i]),
> !                                        ObjectIdGetDatum(attelem),
> !                                        Int32GetDatum(atttypmod));
> !             nulls[i] = ' ';
>           }
>           else
>           {
>               dvalues[i] = (Datum) 0;
>               nulls[i] = 'n';
>           }
> --- 716,747 ----
>       dvalues = (Datum *) palloc(natts * sizeof(Datum));
>       nulls = (char *) palloc(natts * sizeof(char));
>
> !     /* Call the "in" function for each non-null, non-dropped attribute */
>       for (i = 0; i < natts; i++)
>       {
> !         if (!tupdesc->attrs[i]->attisdropped)
>           {
> !             /* Non-dropped attributes */
> !             if (values[i] != NULL)
> !             {
> !                 attelem = attinmeta->attelems[i];
> !                 atttypmod = attinmeta->atttypmods[i];
> !
> !                 dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
> !                                            CStringGetDatum(values[i]),
> !                                            ObjectIdGetDatum(attelem),
> !                                            Int32GetDatum(atttypmod));
> !                 nulls[i] = ' ';
> !             }
> !             else
> !             {
> !                 dvalues[i] = (Datum) 0;
> !                 nulls[i] = 'n';
> !             }
>           }
>           else
>           {
> +             /* Handle dropped attributes by setting to NULL */
>               dvalues[i] = (Datum) 0;
>               nulls[i] = 'n';
>           }

>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so that your
>       message can get through to the mailing list cleanly

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings

From
Bruce Momjian
Date:
Patch applied.  Thanks.

---------------------------------------------------------------------------


Joe Conway wrote:
> I discovered that TupleDescGetAttInMetadata and BuildTupleFromCStrings
> don't deal well with tuples having dropped columns. The attached fixes
> the issue. Please apply.
>
> Thanks,
>
> Joe

> Index: src/backend/executor/execTuples.c
> ===================================================================
> RCS file: /opt/src/cvs/pgsql-server/src/backend/executor/execTuples.c,v
> retrieving revision 1.71
> diff -c -r1.71 execTuples.c
> *** src/backend/executor/execTuples.c    8 Aug 2003 21:41:40 -0000    1.71
> --- src/backend/executor/execTuples.c    21 Sep 2003 23:23:02 -0000
> ***************
> *** 674,689 ****
>        * Gather info needed later to call the "in" function for each
>        * attribute
>        */
> !     attinfuncinfo = (FmgrInfo *) palloc(natts * sizeof(FmgrInfo));
> !     attelems = (Oid *) palloc(natts * sizeof(Oid));
> !     atttypmods = (int32 *) palloc(natts * sizeof(int32));
>
>       for (i = 0; i < natts; i++)
>       {
> !         atttypeid = tupdesc->attrs[i]->atttypid;
> !         getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
> !         fmgr_info(attinfuncid, &attinfuncinfo[i]);
> !         atttypmods[i] = tupdesc->attrs[i]->atttypmod;
>       }
>       attinmeta->tupdesc = tupdesc;
>       attinmeta->attinfuncs = attinfuncinfo;
> --- 674,693 ----
>        * Gather info needed later to call the "in" function for each
>        * attribute
>        */
> !     attinfuncinfo = (FmgrInfo *) palloc0(natts * sizeof(FmgrInfo));
> !     attelems = (Oid *) palloc0(natts * sizeof(Oid));
> !     atttypmods = (int32 *) palloc0(natts * sizeof(int32));
>
>       for (i = 0; i < natts; i++)
>       {
> !         /* Ignore dropped attributes */
> !         if (!tupdesc->attrs[i]->attisdropped)
> !         {
> !             atttypeid = tupdesc->attrs[i]->atttypid;
> !             getTypeInputInfo(atttypeid, &attinfuncid, &attelems[i]);
> !             fmgr_info(attinfuncid, &attinfuncinfo[i]);
> !             atttypmods[i] = tupdesc->attrs[i]->atttypmod;
> !         }
>       }
>       attinmeta->tupdesc = tupdesc;
>       attinmeta->attinfuncs = attinfuncinfo;
> ***************
> *** 712,733 ****
>       dvalues = (Datum *) palloc(natts * sizeof(Datum));
>       nulls = (char *) palloc(natts * sizeof(char));
>
> !     /* Call the "in" function for each non-null attribute */
>       for (i = 0; i < natts; i++)
>       {
> !         if (values[i] != NULL)
>           {
> !             attelem = attinmeta->attelems[i];
> !             atttypmod = attinmeta->atttypmods[i];
> !
> !             dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
> !                                        CStringGetDatum(values[i]),
> !                                        ObjectIdGetDatum(attelem),
> !                                        Int32GetDatum(atttypmod));
> !             nulls[i] = ' ';
>           }
>           else
>           {
>               dvalues[i] = (Datum) 0;
>               nulls[i] = 'n';
>           }
> --- 716,747 ----
>       dvalues = (Datum *) palloc(natts * sizeof(Datum));
>       nulls = (char *) palloc(natts * sizeof(char));
>
> !     /* Call the "in" function for each non-null, non-dropped attribute */
>       for (i = 0; i < natts; i++)
>       {
> !         if (!tupdesc->attrs[i]->attisdropped)
>           {
> !             /* Non-dropped attributes */
> !             if (values[i] != NULL)
> !             {
> !                 attelem = attinmeta->attelems[i];
> !                 atttypmod = attinmeta->atttypmods[i];
> !
> !                 dvalues[i] = FunctionCall3(&attinmeta->attinfuncs[i],
> !                                            CStringGetDatum(values[i]),
> !                                            ObjectIdGetDatum(attelem),
> !                                            Int32GetDatum(atttypmod));
> !                 nulls[i] = ' ';
> !             }
> !             else
> !             {
> !                 dvalues[i] = (Datum) 0;
> !                 nulls[i] = 'n';
> !             }
>           }
>           else
>           {
> +             /* Handle dropped attributes by setting to NULL */
>               dvalues[i] = (Datum) 0;
>               nulls[i] = 'n';
>           }

>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so that your
>       message can get through to the mailing list cleanly

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073