From: | Dmitry Mityugov <d(dot)mityugov(at)postgrespro(dot)ru> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | Peter Eisentraut <peter(at)eisentraut(dot)org>, pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: --with-llvm on 32-bit platforms? |
Date: | 2025-09-16 07:21:30 |
Message-ID: | b527cb2bd4ae3c6cfd5ea7caf79cb3b5@postgrespro.ru |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Tom Lane писал(а) 2025-09-16 03:31:
> Dmitry Mityugov <d(dot)mityugov(at)postgrespro(dot)ru> writes:
>> Tom Lane писал(а) 2025-09-15 23:21:
>>> Interesting, but again, how about a stack trace?
>
>
>> performing post-bootstrap initialization ... TRAP: failed Assert("(X &
>> 0xFFFFFFFF00000000) == 0"), File:
>> "../../../../src/include/postgres.h",
>> Line: 324, PID: 427452
>
>> /home/dd/projects/postgres/vanilla/planb/postgres/master/tmp_install/usr/local/pgsql/bin/postgres(ExceptionalCondition+0x6b)
>> [0x56c990cb]
>> /home/dd/projects/postgres/vanilla/planb/postgres/master/tmp_install/usr/local/pgsql/bin/postgres(toast_tuple_init+0x2f1)
>> [0x567c19e1]
>
> Ah-hah. What's going on there is that toast_tuple_init does
>
> old_value =
> (struct varlena *)
> DatumGetPointer(ttc->ttc_oldvalues[i]);
> new_value =
> (struct varlena *) DatumGetPointer(ttc->ttc_values[i]);
>
> before checking if the values are NULL. Now, this is at least
> theoretically okay because it doesn't try to dereference either
> pointer until it's checked the isnull flags. But the Datum it's
> reading might well be garbage, thus triggering your assertion.
>
> I don't see a really nice way to avoid this. We could perhaps
> do something like
>
> old_value =
> (struct varlena *)
> (ttc->ttc_oldisnull[i] ? NULL :
> DatumGetPointer(ttc->ttc_oldvalues[i]));
>
> but adding extra cycles here isn't very appetizing.
Thank you for the explanation.
> If you want to pursue it further you could temporarily patch
> toast_tuple_init and then see if you get any further, but I'm
> not sure you'll learn anything interesting. I think Munro
> has put his finger on the problem.
This, unrelated to --with-llvm, task, can be pursued on a 64-bit Linux,
provided the system has the multilibs installed and -m32 was added to
the list of compiler options, like in
make distclean -s && ./configure CFLAGS="-Og -m32" --enable-cassert &&
make -sj23 && make check
I created a secondary DatumGetPointer() function, with a bit different
name and without the assert, reproduced the failure using the command
line above, replaced all calls to DatumGetPointer() function in
toast_tuple_init() with the version without assert... And have found no
more problems so far. At least `make check` passes clearly.
Thank you again
From | Date | Subject | |
---|---|---|---|
Next Message | Nitin Motiani | 2025-09-16 07:36:00 | pgstattuple "unexpected zero page" for gist and hash indexes |
Previous Message | Michael Paquier | 2025-09-16 06:50:20 | Re: AioCtl Shared Memory size fix |