@@ -13,6 +13,7 @@ create type vops_float4;
13
13
create type vops_float8 ;
14
14
create type vops_timestamp ;
15
15
create type vops_interval ;
16
+ create type vops_text ;
16
17
17
18
18
19
create function vops_bool_input (cstring) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -35,6 +36,9 @@ create function vops_timestamp_input(cstring) returns vops_timestamp as 'MODULE_
35
36
create function vops_timestamp_output (vops_timestamp) returns cstring as ' MODULE_PATHNAME' ,' vops_int8_output' language C parallel safe immutable strict;
36
37
create function vops_interval_input (cstring) returns vops_interval as ' MODULE_PATHNAME' ,' vops_int8_input' language C parallel safe immutable strict;
37
38
create function vops_interval_output (vops_interval) returns cstring as ' MODULE_PATHNAME' ,' vops_int8_output' language C parallel safe immutable strict;
39
+ create function vops_text_input (cstring,oid ,integer ) returns vops_text as ' MODULE_PATHNAME' language C parallel safe immutable strict;
40
+ create function vops_text_output (vops_text) returns cstring as ' MODULE_PATHNAME' language C parallel safe immutable strict;
41
+ create function vops_text_typmod_in (cstring[]) returns integer as ' MODULE_PATHNAME' language C parallel safe immutable strict;
38
42
39
43
create type vops_bool (
40
44
input = vops_bool_input,
@@ -110,6 +114,72 @@ create type vops_interval (
110
114
internallength = 528 -- 16 + 64*8
111
115
);
112
116
117
+ create type vops_text (
118
+ input = vops_text_input,
119
+ output = vops_text_output,
120
+ typmod_in = vops_text_typmod_in,
121
+ alignment = double
122
+ );
123
+
124
+ -- text tile
125
+
126
+ create function vops_text_const (opd text , width integer ) returns vops_text as ' MODULE_PATHNAME' language C parallel safe immutable strict;
127
+
128
+ create function vops_text_concat (left vops_text, right vops_text) returns vops_int2 as ' MODULE_PATHNAME' language C parallel safe immutable strict;
129
+ create operator || (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_concat);
130
+
131
+ create function vops_text_eq (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
132
+ create function vops_text_eq_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
133
+ create function vops_text_eq_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
134
+ create operator = (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_eq, commutator= = );
135
+ create operator = (leftarg= vops_text, rightarg= text , procedure= vops_text_eq_rconst, commutator= = );
136
+ create operator = (leftarg= text , rightarg= vops_text, procedure= vops_text_eq_lconst, commutator= = );
137
+
138
+ create function vops_text_ne (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
139
+ create function vops_text_ne_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
140
+ create function vops_text_ne_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
141
+ create operator <> (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_ne, commutator= <> );
142
+ create operator <> (leftarg= vops_text, rightarg= text , procedure= vops_text_ne_rconst, commutator= <> );
143
+ create operator <> (leftarg= text , rightarg= vops_text, procedure= vops_text_ne_lconst, commutator= <> );
144
+
145
+ create function vops_text_gt (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
146
+ create function vops_text_gt_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
147
+ create function vops_text_gt_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
148
+ create operator > (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_gt, commutator= < );
149
+ create operator > (leftarg= vops_text, rightarg= text , procedure= vops_text_gt_rconst, commutator= < );
150
+ create operator > (leftarg= text , rightarg= vops_text, procedure= vops_text_gt_lconst, commutator= < );
151
+
152
+ create function vops_text_lt (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
153
+ create function vops_text_lt_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
154
+ create function vops_text_lt_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
155
+ create operator < (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_lt, commutator= > );
156
+ create operator < (leftarg= vops_text, rightarg= text , procedure= vops_text_lt_rconst, commutator= > );
157
+ create operator < (leftarg= text , rightarg= vops_text, procedure= vops_text_lt_lconst, commutator= > );
158
+
159
+ create function vops_text_ge (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
160
+ create function vops_text_ge_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
161
+ create function vops_text_ge_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
162
+ create operator >= (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_ge, commutator= <= );
163
+ create operator >= (leftarg= vops_text, rightarg= text , procedure= vops_text_ge_rconst, commutator= <= );
164
+ create operator >= (leftarg= text , rightarg= vops_text, procedure= vops_text_ge_lconst, commutator= <= );
165
+
166
+ create function vops_text_le (left vops_text, right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
167
+ create function vops_text_le_rconst (left vops_text, right text ) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
168
+ create function vops_text_le_lconst (left text , right vops_text) returns vops_bool as ' MODULE_PATHNAME' language C parallel safe immutable strict;
169
+ create operator <= (leftarg= vops_text, rightarg= vops_text, procedure= vops_text_le, commutator= >= );
170
+ create operator <= (leftarg= vops_text, rightarg= text , procedure= vops_text_le_rconst, commutator= >= );
171
+ create operator <= (leftarg= text , rightarg= vops_text, procedure= vops_text_le_lconst, commutator= >= );
172
+
173
+ create function betwixt (opd vops_text, low text , high text ) returns vops_bool as ' MODULE_PATHNAME' ,' vops_betwixt_text' language C parallel safe immutable strict;
174
+
175
+ create function ifnull (opd vops_text, subst text ) returns vops_text as ' MODULE_PATHNAME' ,' vops_ifnull_text' language C parallel safe immutable strict;
176
+ create function ifnull (opd vops_text, subst vops_text) returns vops_text as ' MODULE_PATHNAME' ,' vops_coalesce_text' language C parallel safe immutable strict;
177
+
178
+ create function first (tile vops_text) returns text as ' MODULE_PATHNAME' ,' vops_text_first' language C parallel safe immutable strict;
179
+ create function last (tile vops_text) returns text as ' MODULE_PATHNAME' ,' vops_text_last' language C parallel safe immutable strict;
180
+ create function low (tile vops_text) returns text as ' MODULE_PATHNAME' ,' vops_text_low' language C parallel safe immutable strict;
181
+ create function high (tile vops_text) returns text as ' MODULE_PATHNAME' ,' vops_text_high' language C parallel safe immutable strict;
182
+
113
183
-- char tile
114
184
115
185
create function vops_char_const (opd " char" ) returns vops_char as ' MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -442,10 +512,10 @@ CREATE AGGREGATE mcount(vops_char) (
442
512
PARALLEL = SAFE
443
513
);
444
514
445
- create function first (tile vops_char) returns char as ' MODULE_PATHNAME' ,' vops_char_first' language C parallel safe immutable strict;
446
- create function last (tile vops_char) returns char as ' MODULE_PATHNAME' ,' vops_char_last' language C parallel safe immutable strict;
447
- create function low (tile vops_char) returns char as ' MODULE_PATHNAME' ,' vops_char_low' language C parallel safe immutable strict;
448
- create function high (tile vops_char) returns char as ' MODULE_PATHNAME' ,' vops_char_high' language C parallel safe immutable strict;
515
+ create function first (tile vops_char) returns " char" as ' MODULE_PATHNAME' ,' vops_char_first' language C parallel safe immutable strict;
516
+ create function last (tile vops_char) returns " char" as ' MODULE_PATHNAME' ,' vops_char_last' language C parallel safe immutable strict;
517
+ create function low (tile vops_char) returns " char" as ' MODULE_PATHNAME' ,' vops_char_low' language C parallel safe immutable strict;
518
+ create function high (tile vops_char) returns " char" as ' MODULE_PATHNAME' ,' vops_char_high' language C parallel safe immutable strict;
449
519
450
520
-- int2 tile
451
521
@@ -3031,6 +3101,8 @@ create cast (vops_bool as bool) with function filter(vops_bool) AS IMPLICIT;
3031
3101
create function is_null (anyelement) returns vops_bool as ' MODULE_PATHNAME' ,' vops_is_null' language C parallel safe immutable;
3032
3102
create function is_not_null (anyelement) returns vops_bool as ' MODULE_PATHNAME' ,' vops_is_not_null' language C parallel safe immutable;
3033
3103
3104
+ -- VOPS FDW
3105
+
3034
3106
CREATE FUNCTION vops_fdw_handler ()
3035
3107
RETURNS fdw_handler
3036
3108
AS ' MODULE_PATHNAME'
@@ -3046,4 +3118,120 @@ CREATE FOREIGN DATA WRAPPER vops_fdw
3046
3118
VALIDATOR vops_fdw_validator;
3047
3119
3048
3120
CREATE SERVER vops_server FOREIGN DATA WRAPPER vops_fdw;
3049
-
3121
+
3122
+ -- Projection generator
3123
+
3124
+ create table vops_projections (projection text primary key , source_table oid , vector_columns integer [], scalar_columns integer [], key_name text );
3125
+ create index on vops_projections(source_table);
3126
+
3127
+
3128
+ create function drop_projection (projection_name text ) returns void as $drop$
3129
+ begin
3130
+ execute ' drop table ' || projection_name;
3131
+ execute ' drop function ' || projection_name|| ' _refresh()' ;
3132
+ delete from vops_projections where projection= projection_name;
3133
+ end;
3134
+ $drop$ language plpgsql;
3135
+
3136
+
3137
+ create function create_projection (projection_name text , source_table regclass, vector_columns text [], scalar_columns text [] default null , order_by text default null ) returns void as $create$
3138
+ declare
3139
+ create_table text ;
3140
+ create_func text ;
3141
+ create_index text ;
3142
+ vector_attno integer [];
3143
+ scalar_attno integer [];
3144
+ att_num integer ;
3145
+ att_name text ;
3146
+ att_typname text ;
3147
+ att_typid integer ;
3148
+ sep text := ' ' ;
3149
+ key_type text ;
3150
+ min_value text ;
3151
+ i integer ;
3152
+ att_typmod integer ;
3153
+ begin
3154
+ create_table := ' create table ' || projection_name|| ' (' ;
3155
+ create_func := ' create function ' || projection_name|| ' _refresh() returns bigint as $$ select populate(source:=' ' ' || source_table::text || ' ' ' ,destination:=' ' ' || projection_name|| ' ' ' ,sort:=' ' ' ;
3156
+ if scalar_columns is not null
3157
+ then
3158
+ create_index := ' create index on ' || projection_name|| ' using brin(' ;
3159
+ foreach att_name IN ARRAY scalar_columns
3160
+ loop
3161
+ select atttypid,attnum,typname into att_typid,att_num,att_typname from pg_attribute,pg_type where attrelid= source_table::oid and attname= att_name and atttypid= pg_type .oid ;
3162
+ if att_typid is null
3163
+ then
3164
+ raise exception ' No attribute % in table %' ,att_name,source_table;
3165
+ end if;
3166
+ scalar_attno := scalar_attno|| att_num;
3167
+ if att_typname= ' char'
3168
+ then
3169
+ att_typname:= ' "char"' ;
3170
+ end if;
3171
+ create_table := create_table|| sep|| att_name|| ' ' || att_typname;
3172
+ create_func := create_func|| sep|| att_name;
3173
+ create_index := create_index|| sep|| att_name;
3174
+ sep := ' ,' ;
3175
+ end loop;
3176
+ end if;
3177
+
3178
+ if order_by is not null
3179
+ then
3180
+ create_func := create_func|| sep|| order_by;
3181
+ end if;
3182
+ create_func := create_func|| ' ' ' ' ; -- end of sort list
3183
+
3184
+ foreach att_name IN ARRAY vector_columns
3185
+ loop
3186
+ select atttypid,attnum,typname,atttypmod into att_typid,att_num,att_typname,att_typmod from pg_attribute,pg_type where attrelid= source_table::oid and attname= att_name and atttypid= pg_type .oid ;
3187
+ if att_typid is null
3188
+ then
3189
+ raise exception ' No attribute % in table %' ,att_name,source_table;
3190
+ end if;
3191
+ if att_typname= ' bpchar' or att_typname= ' varchar'
3192
+ then
3193
+ att_typname:= ' text(' || att_typmod|| ' )' ;
3194
+ end if;
3195
+ vector_attno := vector_attno|| att_num;
3196
+ create_table := create_table|| sep|| att_name|| ' vops_' || att_typname;
3197
+ sep := ' ,' ;
3198
+ if att_name= order_by
3199
+ then
3200
+ key_type = typname;
3201
+ end if;
3202
+ end loop;
3203
+
3204
+ create_table := create_table|| ' )' ;
3205
+ execute create_table;
3206
+
3207
+ if create_index is not null
3208
+ then
3209
+ create_index := create_index|| ' )' ;
3210
+ execute create_index;
3211
+ end if;
3212
+
3213
+ if order_by is not null
3214
+ then
3215
+ if key_type is null
3216
+ then
3217
+ raise exception ' Invalid order column % for projection %' ,order_by,projection_name;
3218
+ end if;
3219
+ create_index := ' create index on ' || projection_name|| ' using brin(first(' || order_by|| ' ))' ;
3220
+ execute create_index;
3221
+ create_index := ' create index on ' || projection_name|| ' using brin(last(' || order_by|| ' ))' ;
3222
+ execute create_index;
3223
+ if key_type= ' timestamp' or key_type= ' date'
3224
+ then
3225
+ min_value := ' ' ' -infinity' ' ' ;
3226
+ else
3227
+ min_value := ' -1' ; -- assume that key have only non-negative values
3228
+ end if;
3229
+ create_func := create_func|| ' ,predicate:=' ' ' || order_by|| ' >(select coalesce(max(last(' || order_by|| ' )),' || min_value|| ' ) from ' || projection_name|| ' )' ' ' ;
3230
+ end if;
3231
+ create_func := create_func|| ' ); $$ language sql' ;
3232
+ execute create_func;
3233
+
3234
+ insert into vops_projections values (projection_name, source_table, vector_attno, scalar_attno, order_by);
3235
+ end;
3236
+ $create$ language plpgsql;
3237
+
0 commit comments