Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1871a62

Browse files
committed
Add vops_initialize and ifnull functions
1 parent6898e1d commit1871a62

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
selectcount(*),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 swhere x>=0.0;
1212
selectcount(*),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 vwhere x>1.0;
1313
selectcount(*),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 swhere x>1.0;
14+
selectcount(*)from vwhere 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
createfunctionbetwixt(opd vops_char, low int4, high int4) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_char' language C parallel safe immutable strict;
193193

194+
createfunctionifnull(opd vops_char, subst int4) returns vops_charas'MODULE_PATHNAME','vops_ifnull_char' language C parallel safe immutable;
195+
194196
createfunctionvops_char_neg(right vops_char) returns vops_charas'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
createfunctionbetwixt(opd vops_int2, low int4, high int4) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_int2' language C parallel safe immutable strict;
404406

407+
createfunctionifnull(opd vops_int2, subst int4) returns vops_int2as'MODULE_PATHNAME','vops_ifnull_int2' language C parallel safe immutable;
408+
405409
createfunctionvops_int2_neg(right vops_int2) returns vops_int2as'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
createfunctionbetwixt(opd vops_int4, low int4, high int4) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_int4' language C parallel safe immutable strict;
605609

610+
createfunctionifnull(opd vops_int4, subst int4) returns vops_int4as'MODULE_PATHNAME','vops_ifnull_int4' language C parallel safe immutable;
611+
606612
createfunctionvops_int4_neg(right vops_int4) returns vops_int4as'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
createfunctionbetwixt(opd vops_date, lowdate, highdate) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_int4' language C parallel safe immutable strict;
802808

809+
createfunctionifnull(opd vops_date, substdate) returns vops_dateas'MODULE_PATHNAME','vops_ifnull_int4' language C parallel safe immutable;
810+
803811
createfunctionvops_date_neg(right vops_date) returns vops_dateas'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
createfunctionbetwixt(opd vops_timestamp, lowtimestamp, hightimestamp) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_int8' language C parallel safe immutable strict;
9991007

1008+
createfunctionifnull(opd vops_timestamp, substtimestamp) returns vops_timestampas'MODULE_PATHNAME','vops_ifnull_int8' language C parallel safe immutable;
1009+
10001010
createfunctionvops_timestamp_neg(right vops_timestamp) returns vops_timestampas'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
createfunctionbetwixt(opd vops_int8, low int8, high int8) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_int8' language C parallel safe immutable strict;
11961206

1207+
createfunctionifnull(opd vops_int8, subst int8) returns vops_int8as'MODULE_PATHNAME','vops_ifnull_int8' language C parallel safe immutable;
1208+
11971209
createfunctionvops_int8_neg(right vops_int8) returns vops_int8as'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
createfunctionbetwixt(opd vops_float4, low float8, high float8) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_float4' language C parallel safe immutable strict;
13841396

1397+
createfunctionifnull(opd vops_float4, subst float8) returns vops_float4as'MODULE_PATHNAME','vops_ifnull_float4' language C parallel safe immutable;
1398+
13851399
createfunctionvops_float4_neg(right vops_float4) returns vops_float4as'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
createfunctionbetwixt(opd vops_float8, low float8, high float8) returns vops_boolas'MODULE_PATHNAME','vops_betwixt_float8' language C parallel safe immutable strict;
15711585

1586+
createfunctionifnull(opd vops_float8, subst float8) returns vops_float8as'MODULE_PATHNAME','vops_ifnull_float8' language C parallel safe immutable;
1587+
15721588
createfunctionvops_float8_neg(right vops_float8) returns vops_float8as'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+
createfunctionvops_initialize() returns voidas'MODULE_PATHNAME' language C;
1727+
17091728
createfunctionfilter(condition vops_bool) returns boolas'MODULE_PATHNAME','vops_filter' language C parallel safe strict immutable;
17101729

17111730
createfunctionpopulate(destination regclass, source regclass, predicate cstring defaultnull, sort cstring defaultnull) returns voidas'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
createfunctionis_null(anyelement) returns vops_boolas'MODULE_PATHNAME','vops_is_null' language C parallel safe immutable;
17211740
createfunctionis_not_null(anyelement) returns vops_boolas'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+
#defineIFNULL_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
#defineBIN_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+
Datumvops_initialize(PG_FUNCTION_ARGS)
1985+
{
1986+
PG_RETURN_VOID();
1987+
}
1988+
19661989

19671990
staticOidvops_bool_oid;
19681991
staticOidfilter_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><aname="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><aname="example">Example</a></h2>

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp