Skip to content

Commit 1871a62

Browse files
committed
Add vops_initialize and ifnull functions
1 parent 6898e1d commit 1871a62

File tree

5 files changed

+56
-1
lines changed

5 files changed

+56
-1
lines changed

expected/test.out

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,9 @@ select count(*),count(x),sum(x),avg(x),min(x),max(x),variance(x),var_pop(x),var_
5858
3 | 3 | 9 | 3 | 2 | 4 | 1 | 0.666666666666667 | 1 | 1 | 0.816496580927726 | 1
5959
(1 row)
6060

61+
select count(*) from v where ifnull(x, 0) >= 0;
62+
count
63+
-------
64+
64
65+
(1 row)
66+

sql/test.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ select count(*),count(x),sum(x),avg(x),min(x),max(x),variance(x),var_pop(x),var_
1111
select count(*),count(x),sum(x),avg(x),min(x),max(x),variance(x),var_pop(x),var_samp(x),stddev(x),stddev_pop(x),stddev_samp(x) from s where x >= 0.0;
1212
select count(*),count(x),sum(x),avg(x),min(x),max(x),variance(x),var_pop(x),var_samp(x),stddev(x),stddev_pop(x),stddev_samp(x) from v where x > 1.0;
1313
select count(*),count(x),sum(x),avg(x),min(x),max(x),variance(x),var_pop(x),var_samp(x),stddev(x),stddev_pop(x),stddev_samp(x) from s where x > 1.0;
14+
select count(*) from v where ifnull(x, 0) >= 0;

vops--1.0.sql

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ create operator <= (leftarg=int4, rightarg=vops_char, procedure=vops_char_le_lco
191191

192192
create function betwixt(opd vops_char, low int4, high int4) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_char' language C parallel safe immutable strict;
193193

194+
create function ifnull(opd vops_char, subst int4) returns vops_char as 'MODULE_PATHNAME','vops_ifnull_char' language C parallel safe immutable;
195+
194196
create function vops_char_neg(right vops_char) returns vops_char as 'MODULE_PATHNAME' language C parallel safe immutable strict;
195197
create operator - (rightarg=vops_char, procedure=vops_char_neg);
196198

@@ -402,6 +404,8 @@ create operator <= (leftarg=int4, rightarg=vops_int2, procedure=vops_int2_le_lco
402404

403405
create function betwixt(opd vops_int2, low int4, high int4) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_int2' language C parallel safe immutable strict;
404406

407+
create function ifnull(opd vops_int2, subst int4) returns vops_int2 as 'MODULE_PATHNAME','vops_ifnull_int2' language C parallel safe immutable;
408+
405409
create function vops_int2_neg(right vops_int2) returns vops_int2 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
406410
create operator - (rightarg=vops_int2, procedure=vops_int2_neg);
407411

@@ -603,6 +607,8 @@ create operator <= (leftarg=int4, rightarg=vops_int4, procedure=vops_int4_le_lco
603607

604608
create function betwixt(opd vops_int4, low int4, high int4) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_int4' language C parallel safe immutable strict;
605609

610+
create function ifnull(opd vops_int4, subst int4) returns vops_int4 as 'MODULE_PATHNAME','vops_ifnull_int4' language C parallel safe immutable;
611+
606612
create function vops_int4_neg(right vops_int4) returns vops_int4 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
607613
create operator - (rightarg=vops_int4, procedure=vops_int4_neg);
608614

@@ -800,6 +806,8 @@ create operator <= (leftarg=date, rightarg=vops_date, procedure=vops_date_le_lco
800806

801807
create function betwixt(opd vops_date, low date, high date) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_int4' language C parallel safe immutable strict;
802808

809+
create function ifnull(opd vops_date, subst date) returns vops_date as 'MODULE_PATHNAME','vops_ifnull_int4' language C parallel safe immutable;
810+
803811
create function vops_date_neg(right vops_date) returns vops_date as 'MODULE_PATHNAME','vops_int4_neg' language C parallel safe immutable strict;
804812
create operator - (rightarg=vops_date, procedure=vops_date_neg);
805813

@@ -997,6 +1005,8 @@ create operator <= (leftarg=timestamp, rightarg=vops_timestamp, procedure=vops_t
9971005

9981006
create function betwixt(opd vops_timestamp, low timestamp, high timestamp) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_int8' language C parallel safe immutable strict;
9991007

1008+
create function ifnull(opd vops_timestamp, subst timestamp) returns vops_timestamp as 'MODULE_PATHNAME','vops_ifnull_int8' language C parallel safe immutable;
1009+
10001010
create function vops_timestamp_neg(right vops_timestamp) returns vops_timestamp as 'MODULE_PATHNAME','vops_int8_neg' language C parallel safe immutable strict;
10011011
create operator - (rightarg=vops_timestamp, procedure=vops_timestamp_neg);
10021012

@@ -1194,6 +1204,8 @@ create operator <= (leftarg=int8, rightarg=vops_int8, procedure=vops_int8_le_lco
11941204

11951205
create function betwixt(opd vops_int8, low int8, high int8) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_int8' language C parallel safe immutable strict;
11961206

1207+
create function ifnull(opd vops_int8, subst int8) returns vops_int8 as 'MODULE_PATHNAME','vops_ifnull_int8' language C parallel safe immutable;
1208+
11971209
create function vops_int8_neg(right vops_int8) returns vops_int8 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
11981210
create operator - (rightarg=vops_int8, procedure=vops_int8_neg);
11991211

@@ -1382,6 +1394,8 @@ create operator <= (leftarg=float8, rightarg=vops_float4, procedure=vops_float4_
13821394

13831395
create function betwixt(opd vops_float4, low float8, high float8) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_float4' language C parallel safe immutable strict;
13841396

1397+
create function ifnull(opd vops_float4, subst float8) returns vops_float4 as 'MODULE_PATHNAME','vops_ifnull_float4' language C parallel safe immutable;
1398+
13851399
create function vops_float4_neg(right vops_float4) returns vops_float4 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
13861400
create operator - (rightarg=vops_float4, procedure=vops_float4_neg);
13871401

@@ -1569,6 +1583,8 @@ create operator <= (leftarg=float8, rightarg=vops_float8, procedure=vops_float8_
15691583

15701584
create function betwixt(opd vops_float8, low float8, high float8) returns vops_bool as 'MODULE_PATHNAME','vops_betwixt_float8' language C parallel safe immutable strict;
15711585

1586+
create function ifnull(opd vops_float8, subst float8) returns vops_float8 as 'MODULE_PATHNAME','vops_ifnull_float8' language C parallel safe immutable;
1587+
15721588
create function vops_float8_neg(right vops_float8) returns vops_float8 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
15731589
create operator - (rightarg=vops_float8, procedure=vops_float8_neg);
15741590

@@ -1706,6 +1722,9 @@ CREATE AGGREGATE countall(*) (
17061722

17071723
-- Generic functions
17081724

1725+
-- Call this function to force loading of VOPS extension (if it is not registered in shared_preload_libraries list
1726+
create function vops_initialize() returns void as 'MODULE_PATHNAME' language C;
1727+
17091728
create function filter(condition vops_bool) returns bool as 'MODULE_PATHNAME','vops_filter' language C parallel safe strict immutable;
17101729

17111730
create function populate(destination regclass, source regclass, predicate cstring default null, sort cstring default null) returns void as 'MODULE_PATHNAME','vops_populate' language C;
@@ -1719,3 +1738,4 @@ create cast (vops_bool as bool) with function filter(vops_bool) AS IMPLICIT;
17191738

17201739
create function is_null(anyelement) returns vops_bool as 'MODULE_PATHNAME','vops_is_null' language C parallel safe immutable;
17211740
create function is_not_null(anyelement) returns vops_bool as 'MODULE_PATHNAME','vops_is_not_null' language C parallel safe immutable;
1741+

vops.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,21 @@ static bool is_vops_type(Oid typeid)
299299
PG_RETURN_POINTER(result); \
300300
} \
301301

302+
#define IFNULL_OP(TYPE,CTYPE,GXTYPE) \
303+
PG_FUNCTION_INFO_V1(vops_ifnull_##TYPE); \
304+
Datum vops_ifnull_##TYPE(PG_FUNCTION_ARGS) \
305+
{ \
306+
vops_##TYPE* opd = (vops_##TYPE*)PG_GETARG_POINTER(0); \
307+
CTYPE subst = (CTYPE)PG_GETARG_##GXTYPE(1); \
308+
vops_##TYPE* result = (vops_##TYPE*)palloc(sizeof(vops_##TYPE)); \
309+
int i; \
310+
for (i = 0; i < TILE_SIZE; i++) { \
311+
result->payload[i] = (opd->nullmask & ((uint64)1 << i)) ? subst : opd->payload[i]; \
312+
} \
313+
result->nullmask = 0; \
314+
PG_RETURN_POINTER(result); \
315+
} \
316+
302317
#define BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,OP,COP) \
303318
PG_FUNCTION_INFO_V1(vops_##TYPE##_##OP##_rconst); \
304319
Datum vops_##TYPE##_##OP##_rconst(PG_FUNCTION_ARGS) \
@@ -1056,6 +1071,7 @@ Datum vops_agg_deserial(PG_FUNCTION_ARGS)
10561071
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,ge,>=) \
10571072
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,ge,>=) \
10581073
BETWIXT_OP(TYPE,XTYPE,GXTYPE) \
1074+
IFNULL_OP(TYPE,CTYPE,GXTYPE) \
10591075
COUNT_AGG(TYPE) \
10601076
SUM_AGG(TYPE,STYPE,GSTYPE) \
10611077
AVG_AGG(TYPE) \
@@ -1963,6 +1979,13 @@ Datum vops_is_not_null(PG_FUNCTION_ARGS)
19631979
}
19641980
PG_RETURN_POINTER(result);
19651981
}
1982+
1983+
PG_FUNCTION_INFO_V1(vops_initialize);
1984+
Datum vops_initialize(PG_FUNCTION_ARGS)
1985+
{
1986+
PG_RETURN_VOID();
1987+
}
1988+
19661989

19671990
static Oid vops_bool_oid;
19681991
static Oid filter_oid;

vops.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,10 @@ <h3><a name="operators">Vector operators</a></h3>
256256
<tr><td><code>&</code></td><td>Boolean AND</td></tr>
257257
<tr><td><code>|</code></td><td>Boolean OR</td></tr>
258258
<tr><td><code>!</code></td><td>Boolean NOT</td></tr>
259-
<tr><td><code>BITWIXT</code></td><td>Analog of BETWEEN</td></tr>
259+
<tr><td><code>bitwixt(x,low,high)</code></td><td>Analog of BETWEEN</td></tr>
260+
<tr><td><code>is_null(x)</code></td><td>Analog of IS NULL</td></tr>
261+
<tr><td><code>is_not_null(x)</code></td><td>Analog of IS NOT NULL</td></tr>
262+
<tr><td><code>ifnull(x,subst)</code></td><td>Analog of COALESCE</td></tr>
260263
</table>
261264

262265
<h3><a name="aggregates">Vector aggregates</a></h3>
@@ -571,6 +574,8 @@ <h2><a name="transform">Standard SQL query transformation</a></h2>
571574
But if extension was not registered in <code>shared_preload_libraries</code> list, then it will be loaded on demand when any function of this extension is requested.
572575
Unfortunately it happens <b>after</b> parse analyze is done. So first time you execute VOPS query, it will not be transformed. You can get wrong result in this case.
573576
Either take it in account, either add <code>vops</code> to <code>shared_preload_libraries</code> configuration string.
577+
VOPS extension provides special function <code>vops_initialize()</code> which can be invoked to force initialization of VOPS extension.
578+
After invocation of this function, extension will be loaded and all subsequent queries will be normally transformed and produce expected results.
574579
</p>
575580

576581
<h2><a name="example">Example</a></h2>

0 commit comments

Comments
 (0)