bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings with dropped cols

Started by Joe Conwayalmost 23 years ago3 messagespatches
Jump to latest
#1Joe Conway
mail@joeconway.com

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

Thanks,

Joe

Attachments:

attinmeta-drop-col-fix.1.patchtext/plain; name=attinmeta-drop-col-fix.1.patchDownload+48-47
#2Bruce Momjian
bruce@momjian.us
In reply to: Joe Conway (#1)
Re: bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings

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
#3Bruce Momjian
bruce@momjian.us
In reply to: Joe Conway (#1)
Re: bug fix: TupleDescGetAttInMetadata/BuildTupleFromCStrings

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