Re: Warnings around booleans

From: Andres Freund <andres(at)anarazel(dot)de>
To: Stephen Frost <sfrost(at)snowman(dot)net>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Warnings around booleans
Date: 2015-08-12 12:32:36
Message-ID: 20150812123236.GA25424@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2015-08-12 08:16:09 -0400, Stephen Frost wrote:
> > 1) gin stores/queries some bools as GinTernaryValue.
> >
> > Part of this is easy to fix, just adjust GinScanKeyData->entryRes to
> > be a GinTernaryValue (it's actually is compared against MAYBE).
> >
> > What I find slightly worrysome is that in gin_tsquery_consistent()
> > checkcondition_gin (returning GinTernaryValue) is passed as a
> > callback that's expected to return bool. And the field
> > checkcondition_gin is returning (GinChkVal->check[i]) actually is a
> > ternary.
>
> Is there a potential corruption issue from that..?

I honestly don't understand the gin code well enough to answer that.

> > 2) help_config.c has a member named 'bool' in a local struct. That
> > doesn't work well if bool actually is a macro. Which mean that whole
> > #ifndef bool patch in c.h wasn't exercised since 2003 when
> > help_config.c was created...
> >
> > => rename field to bool_ (or _bool but that looks a wee close to C's _Bool)
>
> I don't particularly like just renaming it to bool_, for my part, but
> certainly need to do something.

There's alread a _enum in the struct, so that doesn't bother my much.

> > 3) The 'bypassrls' boolean in AlterUser() is queried strangely. There are two
> > complaints:
>
> I assume you mean AlterRole() above?

Oops.

> > bool bypassrls = -1;
> >
> > it's a boolean.
> >
> > else if (authform->rolbypassrls || bypassrls >= 0)
> > {
> > if (!superuser())
> > ereport(ERROR,
> > (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
> > errmsg("must be superuser to change bypassrls attribute")));
> > }
> > ...
> > if (bypassrls >= 0)
> > {
> > new_record[Anum_pg_authid_rolbypassrls - 1] = BoolGetDatum(bypassrls > 0);
> > new_record_repl[Anum_pg_authid_rolbypassrls - 1] = true;
> > }
> >
> > if it's a boolean, that's always true.
> >
> >
> > It's not entirely clear to me why this was written that way. Stephen?
>
> I specifically recall fixing a similar issue in this area but clearly
> didn't realize that it was a bool when, as I recall, I was changing it
> to match what we do for all of the other role attributes. In those
> other cases the value is an int, not a bool though. Changing it to an
> int here should make it line up with the rest of AlterRole().

I find that a somewhat ugly coding pattern, but since the rest of the
function is written that way...

> I'll do that and add regression tests for it and any others which don't
> get tested. My thinking on the test is to independently change each
> value and then poll for all role attributes set and verify that the only
> change made was the change expected.

Do that if you like, but what I really think we should have is a test
that tries to bypass rls and fails, then the user gets changes and it
succeeds, and then it gets disabled and fails again. This really seems
test-worthy behaviour to me.

> > 3) vacuumdb.c stores -1's in a bool (result) in vacuum_one_database().
> >
> > => convert to an int
>
> Perhaps I'm missing something, but it appears to only ever be set to 0
> or -1, so wouldn't it make sense to just correct it to use bool properly
> instead?

Yea, you're right.

> > 4) _tableInfo->relreplident is a bool, should be a char
>
> This results in pg_dump always failing to dump out the necessary
> ALTER TABLE ONLY ... REPLICA IDENTITY ... when it's actually required,
> right? Is that something we can add a regression test to cover which
> will be exercised through the pg_upgrade path?

With our current boolean definition this doesn't fail at all. All the
values fall into both char and unsigned char range.

WRT tests: It'd probably be a good idea to not drop the tables at the
end of replica_identity.sql.

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Stephen Frost 2015-08-12 12:46:15 Re: Warnings around booleans
Previous Message Stephen Frost 2015-08-12 12:16:09 Re: Warnings around booleans