Re: [HACKERS] Re: varchar() troubles (fwd)

Bruce Momjian <maillist@candle.pha.pa.us>

From: Bruce Momjian <maillist@candle.pha.pa.us>
To: vadim@sable.krasnoyarsk.su (Vadim B. Mikheev)
Cc: hackers@postgreSQL.org (PostgreSQL-development)
Date: 1998-01-13T05:42:08Z
Lists: pgsql-hackers
Forwarded message:
> > The problem was that some things were copied using VARSIZE rather than
> > subtracting out VARHDRSZ first (actually, I think it might have use
> > sizeof(int) and other dangers too). I patched that near the end of the year
> > and my 980101.d tree and 980106.d tree do not exhibit the symptom:
> > 
> > postgres=> create table t (v varchar(80),i int);
> > CREATE
> > postgres=> insert into t values ('hi', 1);
> > INSERT 643562 1
> > postgres=> select * from t;
> > v |i
> > --+-
> > hi|1
> > (1 row)
> 
> I have found that ExecEvalVar() uses a descriptor that has the attr
> length set to the maximum, instead of -1.  The ExecTypeFromTL() comment
> says:
> 
> /* ----------------------------------------------------------------
>  *      ExecTypeFromTL
>  *
>  *      Currently there are about 4 different places where we create
>  *      TupleDescriptors.  They should all be merged, or perhaps
>  *      be rewritten to call BuildDesc().
>  *
> 
> Clearly stating that the tuple descriptors in the system are created in
> several places.  Some places have the length set wrong.  I am going to
> have to take a look at all those places, and make sure they have
> consistent behaviour.

Vadim, can you look at this for me.  If you set a break at ExecEvalVar
before executing the SELECT, you will see its
tupledescriptor->attrs[0].attlen is the max length, and not -1 as it
should be.

I can't figure out where that is getting set.  Can you also check the
other tupledescriptor initializations to see they have the -1 for
varchar too.  I am stumped.

-- 
Bruce Momjian
maillist@candle.pha.pa.us