Re: count_nulls(VARIADIC "any")

From: Jim Nasby <Jim(dot)Nasby(at)BlueTreble(dot)com>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>, Marko Tiikkaja <marko(at)joh(dot)to>
Cc: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: count_nulls(VARIADIC "any")
Date: 2016-01-03 21:49:14
Message-ID: 5689975A.101@BlueTreble.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 1/3/16 2:37 PM, Pavel Stehule wrote:
> + /* num_nulls(VARIADIC NULL) is defined as NULL */
> + if (PG_ARGISNULL(0))
> + return false;

Could you add to the comment explaining why that's the desired behavior?

> + /*
> + * Non-null argument had better be an array. We assume that any call
> + * context that could let get_fn_expr_variadic return true will have
> + * checked that a VARIADIC-labeled parameter actually is an array. So
> + * it should be okay to just Assert that it's an array rather than
> + * doing a full-fledged error check.
> + */
> + Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, 0))));

Erm... is that really the way to verify that what you have is an array?
ISTM there should be a macro for that somewhere...

> + /* OK, safe to fetch the array value */
> + arr = PG_GETARG_ARRAYTYPE_P(0);
> +
> + ndims = ARR_NDIM(arr);
> + dims = ARR_DIMS(arr);
> + nitems = ArrayGetNItems(ndims, dims);
> +
> + bitmap = ARR_NULLBITMAP(arr);
> + if (bitmap)
> + {
> + bitmask = 1;
> +
> + for (i = 0; i < nitems; i++)
> + {
> + if ((*bitmap & bitmask) == 0)
> + count++;
> +
> + bitmask <<= 1;
> + if (bitmask == 0x100)
> + {
> + bitmap++;
> + bitmask = 1;

For brevity and example sake it'd probably be better to just use the
normal iterator, unless there's a serious speed difference?

In the unit test, I'd personally prefer just building a table with the
test cases and the expected NULL/NOT NULL results, at least for all the
calls that would fit that paradigm. That should significantly reduce the
size of the test. Not a huge deal though...

Also, I don't think anything is testing multiples of whatever value...
how 'bout change the generate_series CASE statement to >40 instead of <>40?
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dan Langille 2016-01-03 21:58:15 PGCon 2016 call for papers
Previous Message Tom Lane 2016-01-03 21:12:16 Re: pg_upgrade in 9.5 broken for adminpack