From 37439361a6c4ba107e7a1074f02ca0c281f44fb2 Mon Sep 17 00:00:00 2001 From: Vladlen Popolitov <v.popolitov@postgrespro.ru> Date: Tue, 16 Jan 2024 16:12:51 +0300 Subject: [PATCH 1/3] Version 1.4, anyarray support moved to anyarray extension --- Makefile | 3 +- README.md | 26 + docs/README.md | 136 +++ expected/rum_validate.out | 4 +- expected/security.out | 6 +- rum--1.3--1.4.sql | 14 + rum--1.4.sql | 1642 +++++++++++++++++++++++++++++++++++++ rum.control | 2 +- sql/security.sql | 4 +- 9 files changed, 1827 insertions(+), 10 deletions(-) create mode 100644 docs/README.md create mode 100644 rum--1.3--1.4.sql create mode 100644 rum--1.4.sql diff --git a/Makefile b/Makefile index f24246528f..97d92bec19 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,8 @@ endif ifeq ($(MAJORVERSION), 9.6) # arrays are not supported on 9.6 else -REGRESS += array +# arrays are excluded in RUM 1.4 +#REGRESS += array endif # For 9.6-11 we have to make specific target with tap tests diff --git a/README.md b/README.md index 5f3e6887cf..26f087be7e 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,32 @@ For type: `anyarray` This operator class stores `anyarray` elements with any supported by module field. +## Upgrading + +Install the latest version and run in every database you want to upgrade: + +```SQL +ALTER EXTENSION rum UPDATE; +``` +You need to close this database server connection to apply changes. + +You can check the version in the current database with psql command: + +``` +\dx +``` + +## Version Notes + +### 1.4 + +The support of anyarray RUM indexes removed from RUM extension and move to +[anyarray extension](https://github.com/postgrespro/anyarray). + +## Extensibility + +The recommendations for the creation of the new operator classes for RUM index are provided in [the manual](docs/README.md). + ## Todo - Allow multiple additional information (lexemes positions + timestamp). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..ac38b541bb --- /dev/null +++ b/docs/README.md @@ -0,0 +1,136 @@ +# Extensibility + +The RUM interface has a high level of abstraction, requiring the access method implementer only to implement the semantics of the data type being accessed. The GIN layer itself takes care of concurrency, logging and searching the tree structure. + +All it takes to get a RUM access method working is to implement a few user-defined methods, which define the behavior of keys in the tree and the relationships between keys, indexed items, and indexable queries. In short, RUM combines extensibility with generality, code reuse, and a clean interface. + +## List of RUM operator class support functions + +|Number|Function and parameters| +|------|-----------------------| +|FUNCTION 1 |rum_compare(STORAGETYPE, STORAGETYPE)| +|FUNCTION 2 |rum_extract_value(VALUETYPE,internal,internal,internal,internal)| +|FUNCTION 3 |rum_extract_query(QUERYTYPE,internal,smallint,internal,internal,internal,internal)| +|FUNCTION 4 |rum_consistent(internal,smallint,VALUETYPE,int,internal,internal,internal,internal)| +|FUNCTION 5 |rum_compare_prefix(VALUETYPE,VALUETYPE,smallint,internal)| +|FUNCTION 6 |rum_config(internal)| +|FUNCTION 7 |rum_pre_consistent(internal,smallint,VALUETYPE,int,internal,internal,internal,internal)| +|FUNCTION 8 |rum_ordering_distance(internal,smallint,VALUETYPE,int,internal,internal,internal,internal,internal)| +|FUNCTION 9 |rum_outer_distance(VALUETYPE, VALUETYPE, smallint)| +|FUNCTION 10 |rum_join_pos(internal, internal)| + +### Function 1 rum_compare + +``` + int rum_compare(Datum a, Datum b) +``` + +### Function 2 rum_extract_value +``` + Datum *rum_extract_value(Datum itemValue, int32 *nkeys, bool **nullFlags, Datum **addInfo, bool **nullFlagsAddInfo) +``` +Returns a palloc'd array of keys given an item to be indexed. The number of returned keys must be stored into `*nkeys`. If any of the keys can be null, also palloc an array of `*nkeys` bool fields, store its address at `*nullFlags`, and set these null flags as needed. `*nullFlags` can be left NULL (its initial value) if all keys are non-null. The return value can be NULL if the item contains no keys. + +### Function 3 rum_extract_query +``` + Datum *rum_extract_query(Datum query, int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer **extra_data, + bool **nullFlags, int32 *searchMode) +``` +Returns a palloc'd array of keys given a value to be queried; that is, query is the value on the right-hand side of an indexable operator whose left-hand side is the indexed column. `n` is the strategy number of the operator within the operator class (see Section [36.16.2](https://postgrespro.com/docs/postgrespro/15/xindex#XINDEX-STRATEGIES)). Often, rum_extract_query will need to consult `n` to determine the data type of query and the method it should use to extract key values. The number of returned keys must be stored into `*nkeys`. If any of the keys can be null, also palloc an array of `*nkeys` bool fields, store its address at `*nullFlags`, and set these null flags as needed. `*nullFlags` can be left NULL (its initial value) if all keys are non-null. The return value can be NULL if the query contains no keys. + +`searchMode` is an output argument that allows rum_extract_query to specify details about how the search will be done. If `*searchMode` is set to GIN_SEARCH_MODE_DEFAULT (which is the value it is initialized to before call), only items that match at least one of the returned keys are considered candidate matches. If `*searchMode` is set to GIN_SEARCH_MODE_INCLUDE_EMPTY, then in addition to items containing at least one matching key, items that contain no keys at all are considered candidate matches. (This mode is useful for implementing is-subset-of operators, for example.) If `*searchMode` is set to GIN_SEARCH_MODE_ALL, then all non-null items in the index are considered candidate matches, whether they match any of the returned keys or not. (This mode is much slower than the other two choices, since it requires scanning essentially the entire index, but it may be necessary to implement corner cases correctly. An operator that needs this mode in most cases is probably not a good candidate for a RUM operator class.) The symbols to use for setting this mode are defined in rum.h and access/gin.h. + +`pmatch` is an output argument for use when partial match is supported. To use it, rum_extract_query must allocate an array of `*nkeys` bools and store its address at `*pmatch`. Each element of the array should be set to true if the corresponding key requires partial match, false if not. If `*pmatch` is set to NULL then RUM assumes partial match is not required. The variable is initialized to NULL before call, so this argument can simply be ignored by operator classes that do not support partial match. + +`extra_data` is an output argument that allows rum_extract_query to pass additional data to the consistent and comparePartial methods. To use it, rum_extract_query must allocate an array of `*nkeys` pointers and store its address at `*extra_data`, then store whatever it wants to into the individual pointers. The variable is initialized to NULL before call, so this argument can simply be ignored by operator classes that do not require extra data. If `*extra_data` is set, the whole array is passed to the consistent method, and the appropriate element to the comparePartial method. +### Function 4 rum_consistent +``` + bool rum_consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], + bool *recheck, Datum queryKeys[], bool nullFlags[], Datum **addInfo, bool **nullFlagsAddInfo) +``` +An operator class must also provide a function to check if an indexed item matches the query. + +Returns true if an indexed item satisfies the query operator with strategy number `n` (or might satisfy it, if the recheck indication is returned). This function does not have direct access to the indexed item's value, since RUM does not store items explicitly. Rather, what is available is knowledge about which key values extracted from the query appear in a given indexed item. The check array has length `nkeys`, which is the same as the number of keys previously returned by rum_extract_query for this query datum. Each element of the check array is true if the indexed item contains the corresponding query key, i.e., if `(check[i] == true)` the i-th key of the rum_extract_query result array is present in the indexed item. The original query datum is passed in case the consistent method needs to consult it, and so are the `queryKeys[]` and `nullFlags[]` arrays previously returned by rum_extract_query. `extra_data`` is the extra-data array returned by rum_extract_query, or NULL if none. + +When rum_extract_query returns a null key in `queryKeys[]`, the corresponding `check[]` element is true if the indexed item contains a null key; that is, the semantics of `check[]` are like IS NOT DISTINCT FROM. The consistent function can examine the corresponding `nullFlags[]` element if it needs to tell the difference between a regular value match and a null match. + +On success, `*recheck` should be set to true if the heap tuple needs to be rechecked against the query operator, or false if the index test is exact. That is, a false return value guarantees that the heap tuple does not match the query; a true return value with `*recheck` set to false guarantees that the heap tuple does match the query; and a true return value with `*recheck` set to true means that the heap tuple might match the query, so it needs to be fetched and rechecked by evaluating the query operator directly against the originally indexed item. +### Function 5 rum_compare_prefix +``` + int32 rum_compare_prefix(Datum a, Datum b,StrategyNumber n,void *addInfo) +``` +Compares two keys (not indexed items!) and returns an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second. Null keys are never passed to this function. + +Alternatively, if the operator class does not provide a compare method, RUM will look up the default btree operator class for the index key data type, and use its comparison function. It is recommended to specify the comparison function in a RUM operator class that is meant for just one data type, as looking up the btree operator class costs a few cycles. However, polymorphic RUM operator classes (such as array_ops) typically cannot specify a single comparison function. + +### Function 6 rum_config (used names: RUM_CONFIG_PROC configFn) +``` + void rum_config(RumConfig *config) +``` +Example: + +```C +PG_FUNCTION_INFO_V1(rum_int8_config); +Datum +rum_int8_config(PG_FUNCTION_ARGS) +{ + RumConfig *config = (RumConfig *) PG_GETARG_POINTER(0); + + config->addInfoTypeOid = InvalidOid; + /* or config->addInfoTypeOid = INT4OID; */ + + config->strategyInfo[0].strategy = RUM_LEFT_DISTANCE; + config->strategyInfo[0].direction = BackwardScanDirection; + + config->strategyInfo[1].strategy = RUM_RIGHT_DISTANCE; + config->strategyInfo[1].direction = ForwardScanDirection; + /* last element in array */ + config->strategyInfo[2].strategy = InvalidStrategy; + + PG_RETURN_VOID(); +} +``` + +### Function 7 rum_pre_consistent (used names: RUM_PRE_CONSISTENT_PROC preConsistentFn) +``` + bool rum_pre_consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], + bool *recheck, Datum queryKeys[], bool nullFlags[]) + + Return value: + false if index key value is not consistent with query + true if key value MAYBE consistent and will be rechecked in rum_consistent function + Parameters: + check[] contains false, if element is not match any query element. + if all elements in check[] equal to true, this function is not called + if all elements in check[] equal to false, this function is not called + StrategyNumber - the number of the strategy from the class operator + query + nkeys quantity of elements in check[]. If nkeys==0, this function is not called + recheck - parameter is not used + queryKeys[] - returned by rum_extract_query + nullFlags[] - returned by rum_extract_query (or all false, if rum_extract_query did not return nullFlags) +``` +If operator class defines rum_pre_consistent function, it is called before rum_consistent (if search mode equals to GIN_SEARCH_MODE_DEFAULT and not all elements in check[] equal to true). + +### Function 8 rum_ordering_distance (used names: RUM_ORDERING_PROC orderingFn) +``` + double rum_ordering_distance(bool check[], ?StrategyNumber n, ?Datum query, int32 nkeys, ?Pointer extra_data[], + ?bool *recheck, ?Datum queryKeys[], ?bool nullFlags[], Datum **addInfo, bool **nullFlagsAddInfo) + double rum_ordering_distance(Datum curKey, Datum query, StrategyNumber n) +``` +Operator class defines rum_ordering_distance function, if it can provide distance based on index data. If distance calculations can be done using key and query value, 3 parameters function should be defined. If distance calculation can be done using addInfo data (f.e, if addInfo sores value of array size needed for distance calculation), 10 parameters function should be defined. + + +### Function 9 rum_outer_distance (used names: RUM_OUTER_ORDERING_PROC outerOrderingFn) +``` + double rum_outer_distance(Datum outerAddInfo, Datum query, StrategyNumber n) +``` +Similar to rum_ordering_distance for indexes with attached fields. + + +### Function 10 rum_join_pos (used names: RUM_ADDINFO_JOIN joinAddInfoFn) +``` + Datum rum_join_pos(Datum collected_item_addInfo, Datum current_collected_item_addInfo) +``` + + diff --git a/expected/rum_validate.out b/expected/rum_validate.out index e662615e87..ec5525a478 100644 --- a/expected/rum_validate.out +++ b/expected/rum_validate.out @@ -8,8 +8,6 @@ WHERE amname = 'rum' ORDER BY opcname; opcname | amvalidate -----------------------------------+------------ - rum_anyarray_addon_ops | t - rum_anyarray_ops | t rum_bit_ops | t rum_bytea_ops | t rum_char_ops | t @@ -42,7 +40,7 @@ ORDER BY opcname; rum_tsvector_timestamptz_ops | t rum_varbit_ops | t rum_varchar_ops | t -(34 rows) +(32 rows) -- -- Test access method and 'rumidx' index properties diff --git a/expected/security.out b/expected/security.out index 86fcbf81da..2112549c3e 100644 --- a/expected/security.out +++ b/expected/security.out @@ -1,5 +1,5 @@ -- Check security CVE-2020-14350 -CREATE FUNCTION rum_anyarray_similar(anyarray,anyarray) RETURNS bool AS $$ SELECT false $$ LANGUAGE SQL; +CREATE FUNCTION rum_numeric_cmp(numeric, numeric) RETURNS int4 AS $$ SELECT 0 $$ LANGUAGE SQL; CREATE EXTENSION rum; -ERROR: function "rum_anyarray_similar" already exists with same argument types -DROP FUNCTION rum_anyarray_similar(anyarray,anyarray); +ERROR: function "rum_numeric_cmp" already exists with same argument types +DROP FUNCTION rum_numeric_cmp(numeric, numeric); diff --git a/rum--1.3--1.4.sql b/rum--1.3--1.4.sql new file mode 100644 index 0000000000..1b69cc47ce --- /dev/null +++ b/rum--1.3--1.4.sql @@ -0,0 +1,14 @@ +/* + * RUM version 1.4 + */ +DROP OPERATOR CLASS rum_anyarray_addon_ops USING rum CASCADE; +DROP OPERATOR CLASS rum_anyarray_ops USING rum CASCADE; +DROP FUNCTION rum_anyarray_ordering(internal,smallint,anyarray,int,internal,internal,internal,internal,internal); +DROP FUNCTION rum_anyarray_consistent(internal, smallint, anyarray, integer, internal, internal, internal, internal); +DROP FUNCTION rum_extract_anyarray_query(anyarray,internal,smallint,internal,internal,internal,internal); +DROP FUNCTION rum_extract_anyarray(anyarray,internal,internal,internal,internal); +DROP OPERATOR <=> (anyarray,anyarray) CASCADE; +DROP FUNCTION rum_anyarray_distance(anyarray,anyarray); +DROP OPERATOR % (anyarray,anyarray) CASCADE; +DROP FUNCTION rum_anyarray_similar(anyarray,anyarray); +DROP FUNCTION rum_anyarray_config(internal); diff --git a/rum--1.4.sql b/rum--1.4.sql new file mode 100644 index 0000000000..dc3d3e30f2 --- /dev/null +++ b/rum--1.4.sql @@ -0,0 +1,1642 @@ +CREATE FUNCTION rumhandler(internal) +RETURNS index_am_handler +AS 'MODULE_PATHNAME' +LANGUAGE C; + +/* + * RUM access method + */ + +CREATE ACCESS METHOD rum TYPE INDEX HANDLER rumhandler; + +/* + * RUM built-in types, operators and functions + */ + +-- Type used in distance calculations with normalization argument +CREATE TYPE rum_distance_query AS (query tsquery, method int); + +CREATE FUNCTION tsquery_to_distance_query(tsquery) +RETURNS rum_distance_query +AS 'MODULE_PATHNAME', 'tsquery_to_distance_query' +LANGUAGE C IMMUTABLE STRICT; + +CREATE CAST (tsquery AS rum_distance_query) + WITH FUNCTION tsquery_to_distance_query(tsquery) AS IMPLICIT; + +CREATE FUNCTION rum_ts_distance(tsvector,tsquery) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_distance_tt' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_ts_distance(tsvector,tsquery,int) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_distance_ttf' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_ts_distance(tsvector,rum_distance_query) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_distance_td' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + LEFTARG = tsvector, + RIGHTARG = tsquery, + PROCEDURE = rum_ts_distance +); + +CREATE OPERATOR <=> ( + LEFTARG = tsvector, + RIGHTARG = rum_distance_query, + PROCEDURE = rum_ts_distance +); + +CREATE FUNCTION rum_timestamp_distance(timestamp, timestamp) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_timestamp_distance, + LEFTARG = timestamp, + RIGHTARG = timestamp, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_timestamp_left_distance(timestamp, timestamp) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_timestamp_left_distance, + LEFTARG = timestamp, + RIGHTARG = timestamp, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_timestamp_right_distance(timestamp, timestamp) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_timestamp_right_distance, + LEFTARG = timestamp, + RIGHTARG = timestamp, + COMMUTATOR = <=| +); + +/* + * rum_tsvector_ops operator class + */ + +CREATE FUNCTION rum_extract_tsvector(tsvector,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_tsvector_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_tsquery_consistent(internal, smallint, tsvector, integer, internal, internal, internal, internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +-- To prevent calling from SQL +CREATE FUNCTION rum_ts_join_pos(internal, internal) +RETURNS bytea +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR CLASS rum_tsvector_ops +DEFAULT FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + OPERATOR 2 <=> (tsvector, tsquery) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 gin_cmp_tslexeme(text, text), + FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal), + FUNCTION 6 rum_tsvector_config(internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 8 rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal), + FUNCTION 10 rum_ts_join_pos(internal, internal), + STORAGE text; + +/* + * rum_tsvector_hash_ops operator class. + * + * Stores hash of entries as keys in index. + */ + +CREATE FUNCTION rum_extract_tsvector_hash(tsvector,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_extract_tsquery_hash(tsquery,internal,smallint,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR CLASS rum_tsvector_hash_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + OPERATOR 2 <=> (tsvector, tsquery) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btint4cmp(integer, integer), + FUNCTION 2 rum_extract_tsvector_hash(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery_hash(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 6 rum_tsvector_config(internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 8 rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal), + FUNCTION 10 rum_ts_join_pos(internal, internal), + STORAGE integer; + +/* + * rum_timestamp_ops operator class + */ + +-- timestamp operator class + +CREATE FUNCTION rum_timestamp_extract_value(timestamp,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timestamp_compare_prefix(timestamp,timestamp,smallint,internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timestamp_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_timestamp_extract_query(timestamp,internal,smallint,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timestamp_consistent(internal,smallint,timestamp,int,internal,internal,internal,internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timestamp_outer_distance(timestamp, timestamp, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR CLASS rum_timestamp_ops +DEFAULT FOR TYPE timestamp USING rum +AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + --support + FUNCTION 1 timestamp_cmp(timestamp,timestamp), + FUNCTION 2 rum_timestamp_extract_value(timestamp,internal,internal,internal,internal), + FUNCTION 3 rum_timestamp_extract_query(timestamp,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_timestamp_consistent(internal,smallint,timestamp,int,internal,internal,internal,internal), + FUNCTION 5 rum_timestamp_compare_prefix(timestamp,timestamp,smallint,internal), + FUNCTION 6 rum_timestamp_config(internal), + -- support to timestamp distance in rum_tsvector_timestamp_ops + FUNCTION 9 rum_timestamp_outer_distance(timestamp, timestamp, smallint), + OPERATOR 20 <=> (timestamp,timestamp) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (timestamp,timestamp) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (timestamp,timestamp) FOR ORDER BY pg_catalog.float_ops, +STORAGE timestamp; + +/* + * rum_tsvector_timestamp_ops operator class. + * + * Stores timestamp with tsvector. + */ + +CREATE FUNCTION rum_tsquery_timestamp_consistent(internal, smallint, tsvector, integer, internal, internal, internal, internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +/* + * !!!deprecated, use rum_tsvector_addon_ops!!! + */ +CREATE OPERATOR CLASS rum_tsvector_timestamp_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 gin_cmp_tslexeme(text, text), + FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_timestamp_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE text; + +/* + * rum_tsvector_hash_timestamp_ops operator class + * !!!deprecated, use rum_tsvector_hash_addon_ops!!! + */ + +CREATE OPERATOR CLASS rum_tsvector_hash_timestamp_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 btint4cmp(integer, integer), + FUNCTION 2 rum_extract_tsvector_hash(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery_hash(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_timestamp_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE integer; + +/* + * rum_timestamptz_ops operator class + */ + +CREATE FUNCTION rum_timestamptz_distance(timestamptz, timestamptz) +RETURNS float8 +AS 'MODULE_PATHNAME', 'rum_timestamp_distance' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_timestamptz_distance, + LEFTARG = timestamptz, + RIGHTARG = timestamptz, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_timestamptz_left_distance(timestamptz, timestamptz) +RETURNS float8 +AS 'MODULE_PATHNAME', 'rum_timestamp_left_distance' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_timestamptz_left_distance, + LEFTARG = timestamptz, + RIGHTARG = timestamptz, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_timestamptz_right_distance(timestamptz, timestamptz) +RETURNS float8 +AS 'MODULE_PATHNAME', 'rum_timestamp_right_distance' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_timestamptz_right_distance, + LEFTARG = timestamptz, + RIGHTARG = timestamptz, + COMMUTATOR = <=| +); + +CREATE OPERATOR CLASS rum_timestamptz_ops +DEFAULT FOR TYPE timestamptz USING rum +AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + --support + FUNCTION 1 timestamptz_cmp(timestamptz,timestamptz), + FUNCTION 2 rum_timestamp_extract_value(timestamp,internal,internal,internal,internal), + FUNCTION 3 rum_timestamp_extract_query(timestamp,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_timestamp_consistent(internal,smallint,timestamp,int,internal,internal,internal,internal), + FUNCTION 5 rum_timestamp_compare_prefix(timestamp,timestamp,smallint,internal), + FUNCTION 6 rum_timestamp_config(internal), + -- support to timestamptz distance in rum_tsvector_timestamptz_ops + FUNCTION 9 rum_timestamp_outer_distance(timestamp, timestamp, smallint), + OPERATOR 20 <=> (timestamptz,timestamptz) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (timestamptz,timestamptz) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (timestamptz,timestamptz) FOR ORDER BY pg_catalog.float_ops, +STORAGE timestamptz; + +/* + * rum_tsvector_timestamptz_ops operator class. + * + * Stores tsvector with timestamptz. + */ + +CREATE OPERATOR CLASS rum_tsvector_timestamptz_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 gin_cmp_tslexeme(text, text), + FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_timestamp_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE text; + +/* + * rum_tsvector_hash_timestamptz_ops operator class + */ + +CREATE OPERATOR CLASS rum_tsvector_hash_timestamptz_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 btint4cmp(integer, integer), + FUNCTION 2 rum_extract_tsvector_hash(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery_hash(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_timestamp_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE integer; + +/* + * rum_tsquery_ops operator class. + * + * Used for inversed text search. + */ + +CREATE FUNCTION ruminv_extract_tsquery(tsquery,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION ruminv_extract_tsvector(tsvector,internal,smallint,internal,internal,internal,internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION ruminv_tsvector_consistent(internal, smallint, tsvector, integer, internal, internal, internal, internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION ruminv_tsquery_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR CLASS rum_tsquery_ops +DEFAULT FOR TYPE tsquery USING rum +AS + OPERATOR 1 @@ (tsquery, tsvector), + FUNCTION 1 gin_cmp_tslexeme(text, text), + FUNCTION 2 ruminv_extract_tsquery(tsquery,internal,internal,internal,internal), + FUNCTION 3 ruminv_extract_tsvector(tsvector,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 ruminv_tsvector_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 6 ruminv_tsquery_config(internal), + STORAGE text; +/* + * RUM version 1.1 + */ + +CREATE FUNCTION rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +ALTER FUNCTION + rum_tsquery_timestamp_consistent (internal,smallint,tsvector,int,internal,internal,internal,internal) + RENAME TO rum_tsquery_addon_consistent; + +CREATE FUNCTION rum_numeric_cmp(numeric, numeric) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR CLASS rum_tsvector_addon_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 gin_cmp_tslexeme(text, text), + FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_addon_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE text; + +CREATE OPERATOR CLASS rum_tsvector_hash_addon_ops +FOR TYPE tsvector USING rum +AS + OPERATOR 1 @@ (tsvector, tsquery), + --support function + FUNCTION 1 btint4cmp(integer, integer), + FUNCTION 2 rum_extract_tsvector_hash(tsvector,internal,internal,internal,internal), + FUNCTION 3 rum_extract_tsquery_hash(tsquery,internal,smallint,internal,internal,internal,internal), + FUNCTION 4 rum_tsquery_addon_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal), + STORAGE integer; + +/*--------------------int2-----------------------*/ + +CREATE FUNCTION rum_int2_extract_value(int2, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int2_compare_prefix(int2, int2, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int2_extract_query(int2, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_int2_distance(int2, int2) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_int2_distance, + LEFTARG = int2, + RIGHTARG = int2, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_int2_left_distance(int2, int2) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_int2_left_distance, + LEFTARG = int2, + RIGHTARG = int2, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_int2_right_distance(int2, int2) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_int2_right_distance, + LEFTARG = int2, + RIGHTARG = int2, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_int2_outer_distance(int2, int2, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int2_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_int2_ops +DEFAULT FOR TYPE int2 USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (int2,int2) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (int2,int2) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (int2,int2) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btint2cmp(int2,int2), + FUNCTION 2 rum_int2_extract_value(int2, internal), + FUNCTION 3 rum_int2_extract_query(int2, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_int2_compare_prefix(int2,int2,int2, internal), + -- support to int2 distance in rum_tsvector_addon_ops + FUNCTION 6 rum_int2_config(internal), + FUNCTION 9 rum_int2_outer_distance(int2, int2, smallint), +STORAGE int2; + +/*--------------------int4-----------------------*/ + +CREATE FUNCTION rum_int4_extract_value(int4, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int4_compare_prefix(int4, int4, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int4_extract_query(int4, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_int4_distance(int4, int4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_int4_distance, + LEFTARG = int4, + RIGHTARG = int4, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_int4_left_distance(int4, int4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_int4_left_distance, + LEFTARG = int4, + RIGHTARG = int4, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_int4_right_distance(int4, int4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_int4_right_distance, + LEFTARG = int4, + RIGHTARG = int4, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_int4_outer_distance(int4, int4, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int4_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_int4_ops +DEFAULT FOR TYPE int4 USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (int4,int4) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (int4,int4) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (int4,int4) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btint4cmp(int4,int4), + FUNCTION 2 rum_int4_extract_value(int4, internal), + FUNCTION 3 rum_int4_extract_query(int4, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_int4_compare_prefix(int4,int4,int2, internal), + -- support to int4 distance in rum_tsvector_addon_ops + FUNCTION 6 rum_int4_config(internal), + FUNCTION 9 rum_int4_outer_distance(int4, int4, smallint), +STORAGE int4; + +/*--------------------int8-----------------------*/ + +CREATE FUNCTION rum_int8_extract_value(int8, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int8_compare_prefix(int8, int8, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int8_extract_query(int8, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_int8_distance(int8, int8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_int8_distance, + LEFTARG = int8, + RIGHTARG = int8, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_int8_left_distance(int8, int8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_int8_left_distance, + LEFTARG = int8, + RIGHTARG = int8, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_int8_right_distance(int8, int8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_int8_right_distance, + LEFTARG = int8, + RIGHTARG = int8, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_int8_outer_distance(int8, int8, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_int8_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_int8_ops +DEFAULT FOR TYPE int8 USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (int8,int8) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (int8,int8) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (int8,int8) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btint8cmp(int8,int8), + FUNCTION 2 rum_int8_extract_value(int8, internal), + FUNCTION 3 rum_int8_extract_query(int8, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_int8_compare_prefix(int8,int8,int2, internal), + -- support to int8 distance in rum_tsvector_addon_ops + FUNCTION 6 rum_int8_config(internal), + FUNCTION 9 rum_int8_outer_distance(int8, int8, smallint), +STORAGE int8; + +/*--------------------float4-----------------------*/ + +CREATE FUNCTION rum_float4_extract_value(float4, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float4_compare_prefix(float4, float4, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float4_extract_query(float4, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_float4_distance(float4, float4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_float4_distance, + LEFTARG = float4, + RIGHTARG = float4, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_float4_left_distance(float4, float4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_float4_left_distance, + LEFTARG = float4, + RIGHTARG = float4, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_float4_right_distance(float4, float4) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_float4_right_distance, + LEFTARG = float4, + RIGHTARG = float4, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_float4_outer_distance(float4, float4, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float4_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_float4_ops +DEFAULT FOR TYPE float4 USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (float4,float4) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (float4,float4) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (float4,float4) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btfloat4cmp(float4,float4), + FUNCTION 2 rum_float4_extract_value(float4, internal), + FUNCTION 3 rum_float4_extract_query(float4, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_float4_compare_prefix(float4,float4,int2, internal), + -- support to float4 distance in rum_tsvector_addon_ops + FUNCTION 6 rum_float4_config(internal), + FUNCTION 9 rum_float4_outer_distance(float4, float4, smallint), +STORAGE float4; + +/*--------------------float8-----------------------*/ + +CREATE FUNCTION rum_float8_extract_value(float8, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float8_compare_prefix(float8, float8, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float8_extract_query(float8, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_float8_distance(float8, float8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_float8_distance, + LEFTARG = float8, + RIGHTARG = float8, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_float8_left_distance(float8, float8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_float8_left_distance, + LEFTARG = float8, + RIGHTARG = float8, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_float8_right_distance(float8, float8) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_float8_right_distance, + LEFTARG = float8, + RIGHTARG = float8, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_float8_outer_distance(float8, float8, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_float8_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_float8_ops +DEFAULT FOR TYPE float8 USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (float8,float8) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (float8,float8) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (float8,float8) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btfloat8cmp(float8,float8), + FUNCTION 2 rum_float8_extract_value(float8, internal), + FUNCTION 3 rum_float8_extract_query(float8, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_float8_compare_prefix(float8,float8,int2, internal), + -- support to float8 distance in rum_tsvector_addon_ops + FUNCTION 6 rum_float8_config(internal), + FUNCTION 9 rum_float8_outer_distance(float8, float8, smallint), +STORAGE float8; + +/*--------------------money-----------------------*/ + +CREATE FUNCTION rum_money_extract_value(money, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_money_compare_prefix(money, money, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_money_extract_query(money, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_money_distance(money, money) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_money_distance, + LEFTARG = money, + RIGHTARG = money, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_money_left_distance(money, money) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_money_left_distance, + LEFTARG = money, + RIGHTARG = money, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_money_right_distance(money, money) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_money_right_distance, + LEFTARG = money, + RIGHTARG = money, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_money_outer_distance(money, money, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_money_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_money_ops +DEFAULT FOR TYPE money USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (money,money) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (money,money) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (money,money) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 cash_cmp(money,money), + FUNCTION 2 rum_money_extract_value(money, internal), + FUNCTION 3 rum_money_extract_query(money, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_money_compare_prefix(money,money,int2, internal), + -- support to money distance in rum_tsvector_addon_ops + FUNCTION 6 rum_money_config(internal), + FUNCTION 9 rum_money_outer_distance(money, money, smallint), +STORAGE money; + +/*--------------------oid-----------------------*/ + +CREATE FUNCTION rum_oid_extract_value(oid, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_oid_compare_prefix(oid, oid, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_oid_extract_query(oid, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + +CREATE FUNCTION rum_oid_distance(oid, oid) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=> ( + PROCEDURE = rum_oid_distance, + LEFTARG = oid, + RIGHTARG = oid, + COMMUTATOR = <=> +); + +CREATE FUNCTION rum_oid_left_distance(oid, oid) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR <=| ( + PROCEDURE = rum_oid_left_distance, + LEFTARG = oid, + RIGHTARG = oid, + COMMUTATOR = |=> +); + +CREATE FUNCTION rum_oid_right_distance(oid, oid) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR |=> ( + PROCEDURE = rum_oid_right_distance, + LEFTARG = oid, + RIGHTARG = oid, + COMMUTATOR = <=| +); + +CREATE FUNCTION rum_oid_outer_distance(oid, oid, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_oid_config(internal) +RETURNS void +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + + +CREATE OPERATOR CLASS rum_oid_ops +DEFAULT FOR TYPE oid USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + OPERATOR 20 <=> (oid,oid) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 21 <=| (oid,oid) FOR ORDER BY pg_catalog.float_ops, + OPERATOR 22 |=> (oid,oid) FOR ORDER BY pg_catalog.float_ops, + FUNCTION 1 btoidcmp(oid,oid), + FUNCTION 2 rum_oid_extract_value(oid, internal), + FUNCTION 3 rum_oid_extract_query(oid, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_oid_compare_prefix(oid,oid,int2, internal), + -- support to oid distance in rum_tsvector_addon_ops + FUNCTION 6 rum_oid_config(internal), + FUNCTION 9 rum_oid_outer_distance(oid, oid, smallint), +STORAGE oid; + +/*--------------------time-----------------------*/ + +CREATE FUNCTION rum_time_extract_value(time, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_time_compare_prefix(time, time, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_time_extract_query(time, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_time_ops +DEFAULT FOR TYPE time USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 time_cmp(time,time), + FUNCTION 2 rum_time_extract_value(time, internal), + FUNCTION 3 rum_time_extract_query(time, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_time_compare_prefix(time,time,int2, internal), +STORAGE time; + +/*--------------------timetz-----------------------*/ + +CREATE FUNCTION rum_timetz_extract_value(timetz, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timetz_compare_prefix(timetz, timetz, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_timetz_extract_query(timetz, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_timetz_ops +DEFAULT FOR TYPE timetz USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 timetz_cmp(timetz,timetz), + FUNCTION 2 rum_timetz_extract_value(timetz, internal), + FUNCTION 3 rum_timetz_extract_query(timetz, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_timetz_compare_prefix(timetz,timetz,int2, internal), +STORAGE timetz; + +/*--------------------date-----------------------*/ + +CREATE FUNCTION rum_date_extract_value(date, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_date_compare_prefix(date, date, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_date_extract_query(date, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_date_ops +DEFAULT FOR TYPE date USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 date_cmp(date,date), + FUNCTION 2 rum_date_extract_value(date, internal), + FUNCTION 3 rum_date_extract_query(date, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_date_compare_prefix(date,date,int2, internal), +STORAGE date; + +/*--------------------interval-----------------------*/ + +CREATE FUNCTION rum_interval_extract_value(interval, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_interval_compare_prefix(interval, interval, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_interval_extract_query(interval, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_interval_ops +DEFAULT FOR TYPE interval USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 interval_cmp(interval,interval), + FUNCTION 2 rum_interval_extract_value(interval, internal), + FUNCTION 3 rum_interval_extract_query(interval, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_interval_compare_prefix(interval,interval,int2, internal), +STORAGE interval; + +/*--------------------macaddr-----------------------*/ + +CREATE FUNCTION rum_macaddr_extract_value(macaddr, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_macaddr_compare_prefix(macaddr, macaddr, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_macaddr_extract_query(macaddr, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_macaddr_ops +DEFAULT FOR TYPE macaddr USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 macaddr_cmp(macaddr,macaddr), + FUNCTION 2 rum_macaddr_extract_value(macaddr, internal), + FUNCTION 3 rum_macaddr_extract_query(macaddr, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_macaddr_compare_prefix(macaddr,macaddr,int2, internal), +STORAGE macaddr; + +/*--------------------inet-----------------------*/ + +CREATE FUNCTION rum_inet_extract_value(inet, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_inet_compare_prefix(inet, inet, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_inet_extract_query(inet, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_inet_ops +DEFAULT FOR TYPE inet USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 network_cmp(inet,inet), + FUNCTION 2 rum_inet_extract_value(inet, internal), + FUNCTION 3 rum_inet_extract_query(inet, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_inet_compare_prefix(inet,inet,int2, internal), +STORAGE inet; + +/*--------------------cidr-----------------------*/ + +CREATE FUNCTION rum_cidr_extract_value(cidr, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_cidr_compare_prefix(cidr, cidr, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_cidr_extract_query(cidr, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_cidr_ops +DEFAULT FOR TYPE cidr USING rum +AS + OPERATOR 1 < (inet, inet), + OPERATOR 2 <= (inet, inet), + OPERATOR 3 = (inet, inet), + OPERATOR 4 >= (inet, inet), + OPERATOR 5 > (inet, inet), + FUNCTION 1 network_cmp(inet,inet), + FUNCTION 2 rum_cidr_extract_value(cidr, internal), + FUNCTION 3 rum_cidr_extract_query(cidr, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_cidr_compare_prefix(cidr,cidr,int2, internal), +STORAGE cidr; + +/*--------------------text-----------------------*/ + +CREATE FUNCTION rum_text_extract_value(text, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_text_compare_prefix(text, text, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_text_extract_query(text, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_text_ops +DEFAULT FOR TYPE text USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 bttextcmp(text,text), + FUNCTION 2 rum_text_extract_value(text, internal), + FUNCTION 3 rum_text_extract_query(text, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_text_compare_prefix(text,text,int2, internal), +STORAGE text; + +/*--------------------varchar-----------------------*/ + + +CREATE OPERATOR CLASS rum_varchar_ops +DEFAULT FOR TYPE varchar USING rum +AS + OPERATOR 1 < (text, text), + OPERATOR 2 <= (text, text), + OPERATOR 3 = (text, text), + OPERATOR 4 >= (text, text), + OPERATOR 5 > (text, text), + FUNCTION 1 bttextcmp(text,text), + FUNCTION 2 rum_text_extract_value(text, internal), + FUNCTION 3 rum_text_extract_query(text, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_text_compare_prefix(text,text,int2, internal), +STORAGE varchar; + +/*--------------------"char"-----------------------*/ + +CREATE FUNCTION rum_char_extract_value("char", internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_char_compare_prefix("char", "char", int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_char_extract_query("char", internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_char_ops +DEFAULT FOR TYPE "char" USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 btcharcmp("char","char"), + FUNCTION 2 rum_char_extract_value("char", internal), + FUNCTION 3 rum_char_extract_query("char", internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_char_compare_prefix("char","char",int2, internal), +STORAGE "char"; + +/*--------------------bytea-----------------------*/ + +CREATE FUNCTION rum_bytea_extract_value(bytea, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_bytea_compare_prefix(bytea, bytea, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_bytea_extract_query(bytea, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_bytea_ops +DEFAULT FOR TYPE bytea USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 byteacmp(bytea,bytea), + FUNCTION 2 rum_bytea_extract_value(bytea, internal), + FUNCTION 3 rum_bytea_extract_query(bytea, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_bytea_compare_prefix(bytea,bytea,int2, internal), +STORAGE bytea; + +/*--------------------bit-----------------------*/ + +CREATE FUNCTION rum_bit_extract_value(bit, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_bit_compare_prefix(bit, bit, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_bit_extract_query(bit, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_bit_ops +DEFAULT FOR TYPE bit USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 bitcmp(bit,bit), + FUNCTION 2 rum_bit_extract_value(bit, internal), + FUNCTION 3 rum_bit_extract_query(bit, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_bit_compare_prefix(bit,bit,int2, internal), +STORAGE bit; + +/*--------------------varbit-----------------------*/ + +CREATE FUNCTION rum_varbit_extract_value(varbit, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_varbit_compare_prefix(varbit, varbit, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_varbit_extract_query(varbit, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_varbit_ops +DEFAULT FOR TYPE varbit USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 varbitcmp(varbit,varbit), + FUNCTION 2 rum_varbit_extract_value(varbit, internal), + FUNCTION 3 rum_varbit_extract_query(varbit, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_varbit_compare_prefix(varbit,varbit,int2, internal), +STORAGE varbit; + +/*--------------------numeric-----------------------*/ + +CREATE FUNCTION rum_numeric_extract_value(numeric, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_numeric_compare_prefix(numeric, numeric, int2, internal) +RETURNS int4 +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION rum_numeric_extract_query(numeric, internal, int2, internal, internal) +RETURNS internal +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR CLASS rum_numeric_ops +DEFAULT FOR TYPE numeric USING rum +AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 rum_numeric_cmp(numeric,numeric), + FUNCTION 2 rum_numeric_extract_value(numeric, internal), + FUNCTION 3 rum_numeric_extract_query(numeric, internal, int2, internal, internal), + FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal), + FUNCTION 5 rum_numeric_compare_prefix(numeric,numeric,int2, internal), +STORAGE numeric; + +/* + * RUM version 1.2 + */ + +/*--------------------int2-----------------------*/ + +CREATE FUNCTION rum_int2_key_distance(int2, int2, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_int2_ops USING rum ADD + FUNCTION 8 (int2,int2) rum_int2_key_distance(int2, int2, smallint); + +/*--------------------int4-----------------------*/ + +CREATE FUNCTION rum_int4_key_distance(int4, int4, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_int4_ops USING rum ADD + FUNCTION 8 (int4,int4) rum_int4_key_distance(int4, int4, smallint); + +/*--------------------int8-----------------------*/ + +CREATE FUNCTION rum_int8_key_distance(int8, int8, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_int8_ops USING rum ADD + FUNCTION 8 (int8,int8) rum_int8_key_distance(int8, int8, smallint); + +/*--------------------float4-----------------------*/ + +CREATE FUNCTION rum_float4_key_distance(float4, float4, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_float4_ops USING rum ADD + FUNCTION 8 (float4,float4) rum_float4_key_distance(float4, float4, smallint); + +/*--------------------float8-----------------------*/ + +CREATE FUNCTION rum_float8_key_distance(float8, float8, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_float8_ops USING rum ADD + FUNCTION 8 (float8,float8) rum_float8_key_distance(float8, float8, smallint); + +/*--------------------money-----------------------*/ + +CREATE FUNCTION rum_money_key_distance(money, money, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_money_ops USING rum ADD + FUNCTION 8 (money,money) rum_money_key_distance(money, money, smallint); + +/*--------------------oid-----------------------*/ + +CREATE FUNCTION rum_oid_key_distance(oid, oid, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_oid_ops USING rum ADD + FUNCTION 8 (oid,oid) rum_oid_key_distance(oid, oid, smallint); + +/*--------------------timestamp-----------------------*/ + +CREATE FUNCTION rum_timestamp_key_distance(timestamp, timestamp, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_timestamp_ops USING rum ADD + FUNCTION 8 (timestamp,timestamp) rum_timestamp_key_distance(timestamp, timestamp, smallint); + +/*--------------------timestamptz-----------------------*/ + +CREATE FUNCTION rum_timestamptz_key_distance(timestamptz, timestamptz, smallint) +RETURNS float8 +AS 'MODULE_PATHNAME' +LANGUAGE C IMMUTABLE STRICT; + + +ALTER OPERATOR FAMILY rum_timestamptz_ops USING rum ADD + FUNCTION 8 (timestamptz,timestamptz) rum_timestamptz_key_distance(timestamptz, timestamptz, smallint); + +/* + * RUM version 1.3 + */ + +CREATE FUNCTION rum_ts_score(tsvector,tsquery) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_score_tt' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_ts_score(tsvector,tsquery,int) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_score_ttf' +LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION rum_ts_score(tsvector,rum_distance_query) +RETURNS float4 +AS 'MODULE_PATHNAME', 'rum_ts_score_td' +LANGUAGE C IMMUTABLE STRICT; + +/* + * RUM version 1.4 + */ diff --git a/rum.control b/rum.control index 30a00ccf67..d9e56582b7 100644 --- a/rum.control +++ b/rum.control @@ -1,5 +1,5 @@ # RUM extension comment = 'RUM index access method' -default_version = '1.3' +default_version = '1.4' module_pathname = '$libdir/rum' relocatable = true diff --git a/sql/security.sql b/sql/security.sql index da7b83957b..63c580030d 100644 --- a/sql/security.sql +++ b/sql/security.sql @@ -1,5 +1,5 @@ -- Check security CVE-2020-14350 -CREATE FUNCTION rum_anyarray_similar(anyarray,anyarray) RETURNS bool AS $$ SELECT false $$ LANGUAGE SQL; +CREATE FUNCTION rum_numeric_cmp(numeric, numeric) RETURNS int4 AS $$ SELECT 0 $$ LANGUAGE SQL; CREATE EXTENSION rum; -DROP FUNCTION rum_anyarray_similar(anyarray,anyarray); +DROP FUNCTION rum_numeric_cmp(numeric, numeric); From 29c964ec1bd25f8d53bd1fe74974862f5c5ec3f1 Mon Sep 17 00:00:00 2001 From: Vladlen Popolitov <v.popolitov@postgrespro.ru> Date: Tue, 16 Jan 2024 16:20:41 +0300 Subject: [PATCH 2/3] README.md updates --- README.md | 2 +- docs/README.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 26f087be7e..47c31aa7a6 100644 --- a/README.md +++ b/README.md @@ -301,7 +301,7 @@ You can check the version in the current database with psql command: ### 1.4 -The support of anyarray RUM indexes removed from RUM extension and move to +The support of anyarray RUM indexes removed from RUM extension and moved to [anyarray extension](https://github.com/postgrespro/anyarray). ## Extensibility diff --git a/docs/README.md b/docs/README.md index ac38b541bb..8838beed28 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,6 +24,9 @@ All it takes to get a RUM access method working is to implement a few user-defin ``` int rum_compare(Datum a, Datum b) ``` +Compares two keys (not indexed items!) and returns an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second. Null keys are never passed to this function. + +Alternatively, if the operator class does not provide a compare method, RUM will look up the default btree operator class for the index key data type, and use its comparison function. It is recommended to specify the comparison function in a RUM operator class that is meant for just one data type, as looking up the btree operator class costs a few cycles. However, polymorphic RUM operator classes (such as array_ops) typically cannot specify a single comparison function. ### Function 2 rum_extract_value ``` @@ -59,9 +62,6 @@ On success, `*recheck` should be set to true if the heap tuple needs to be reche ``` int32 rum_compare_prefix(Datum a, Datum b,StrategyNumber n,void *addInfo) ``` -Compares two keys (not indexed items!) and returns an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second. Null keys are never passed to this function. - -Alternatively, if the operator class does not provide a compare method, RUM will look up the default btree operator class for the index key data type, and use its comparison function. It is recommended to specify the comparison function in a RUM operator class that is meant for just one data type, as looking up the btree operator class costs a few cycles. However, polymorphic RUM operator classes (such as array_ops) typically cannot specify a single comparison function. ### Function 6 rum_config (used names: RUM_CONFIG_PROC configFn) ``` @@ -114,11 +114,11 @@ If operator class defines rum_pre_consistent function, it is called before rum_c ### Function 8 rum_ordering_distance (used names: RUM_ORDERING_PROC orderingFn) ``` - double rum_ordering_distance(bool check[], ?StrategyNumber n, ?Datum query, int32 nkeys, ?Pointer extra_data[], - ?bool *recheck, ?Datum queryKeys[], ?bool nullFlags[], Datum **addInfo, bool **nullFlagsAddInfo) + double rum_ordering_distance(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], + bool *recheck, Datum queryKeys[], bool queryCategories[], Datum **addInfo, bool **nullFlagsAddInfo) double rum_ordering_distance(Datum curKey, Datum query, StrategyNumber n) ``` -Operator class defines rum_ordering_distance function, if it can provide distance based on index data. If distance calculations can be done using key and query value, 3 parameters function should be defined. If distance calculation can be done using addInfo data (f.e, if addInfo sores value of array size needed for distance calculation), 10 parameters function should be defined. +Operator class defines rum_ordering_distance function, if it can provide distance based on index data. If distance calculations can be done using key and query value, 3 parameters function should be defined. If distance calculation can be done using addInfo data (f.e, if addInfo stores value of array size needed for distance calculation), 10 parameters function should be defined. ### Function 9 rum_outer_distance (used names: RUM_OUTER_ORDERING_PROC outerOrderingFn) From 61ead3d11106eb4cca5c4c035e17c75df50c9be4 Mon Sep 17 00:00:00 2001 From: Vladlen Popolitov <v.popolitov@postgrespro.ru> Date: Wed, 17 Jan 2024 16:20:06 +0300 Subject: [PATCH 3/3] RUM version is changed in Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 97d92bec19..3e9134b7ad 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ MODULE_big = rum EXTENSION = rum -EXTVERSION = 1.3 +EXTVERSION = 1.4 PGFILEDESC = "RUM index access method" OBJS = src/rumsort.o src/rum_ts_utils.o src/rumtsquery.o \ @@ -13,7 +13,7 @@ OBJS = src/rumsort.o src/rum_ts_utils.o src/rumtsquery.o \ DATA_first = rum--1.0.sql DATA_updates = rum--1.0--1.1.sql rum--1.1--1.2.sql \ - rum--1.2--1.3.sql + rum--1.2--1.3.sql rum--1.3--1.4.sql DATA = $(DATA_first) rum--$(EXTVERSION).sql $(DATA_updates)