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

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: [HACKERS] Re: varchar() troubles (fwd)
Дата
Msg-id 199801130542.AAA20669@candle.pha.pa.us
обсуждение исходный текст
Список 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

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

Предыдущее
От: "neil d. quiogue"
Дата:
Сообщение: for the development team (fwd)
Следующее
От: "Vadim B. Mikheev"
Дата:
Сообщение: Re: [HACKERS] Storing rows bigger than one block