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
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 |