Writing a user-defined type on PostgreSQL Heikki...
Transcript of Writing a user-defined type on PostgreSQL Heikki...
![Page 1: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/1.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 1
Writing a user-defined typeon PostgreSQL
Heikki Linnakangas
![Page 2: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/2.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 2
What is a data type?
• A data type encapsulates semantics and rules
![Page 3: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/3.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 3
Domains
• Easy to create• Domain creates a “subtype” of an existing base
type• Shares operators with base type• Can have additional constraints on what is
accepted
CREATE DOMAIN countrycode AS textCHECK (value ~ '^[a-z][a-z]$');
![Page 4: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/4.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 4
Enum types
• A list of values• Typically used for states
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
![Page 5: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/5.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 5
Creating a new base type
• At a minimum you need• Input and output functions
– Converts from/to string to internal format
• Internal storage– fixed-size, or– variable length
![Page 6: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/6.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 6
Example
• Data type for representing colours– As a 24-bit RGB value– For convenience, stored in a 32-bit integer– String representation in hex:
• #000000 – black• #FF0000 – red• #0000A0 – dark blue• #FFFFFF – white
![Page 7: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/7.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 7
Writing an extension in C
~/colour_type (master)$ ls l
yhteensä 16
rwrr 1 heikki heikki 919 3.2. 11:53 colour.c
rwrr 1 heikki heikki 418 3.2. 11:47 colour.sql.in
rwrr 1 heikki heikki 308 3.2. 11:31 Makefile
rwrr 1 heikki heikki 118 3.2. 11:49 uninstall_colour.sql
![Page 8: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/8.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 8
I/O functions
/* colour_out */PG_FUNCTION_INFO_V1(colour_out);Datumcolour_out(PG_FUNCTION_ARGS){ Int32 val = PG_GETARG_INT32(0); char *result = palloc(8);
snprintf(result, 8, "#%06X", val); PG_RETURN_CSTRING(result);}
![Page 9: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/9.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 9
I/O functions
/* colour_in */
PG_FUNCTION_INFO_V1(colour_in);
Datum
colour_in(PG_FUNCTION_ARGS)
{
const char *str = PG_GETARG_CSTRING(0);
int32 result;
if (str[0] != '#' || strspn(&str[1], "01234567890ABCDEF") != 6)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for colour: \"%s\"", str)));
sscanf(str, "#%X", &result);
PG_RETURN_INT32(result);
}
![Page 10: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/10.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 10
Register type with PostgreSQL
SET search_path = public;
CREATE OR REPLACE FUNCTION colour_in(cstring) RETURNS colour
AS 'MODULE_PATHNAME' LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION colour_out(colour) RETURNS cstring
AS 'MODULE_PATHNAME' LANGUAGE 'C' IMMUTABLE STRICT;
CREATE TYPE colour (
INPUT = colour_in,
OUTPUT = colour_out,
LIKE = pg_catalog.int4
);
![Page 11: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/11.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 11
The type is ready!
postgres=# CREATE TABLE colour_names (
name text,
rgbvalue colour
);
CREATE TABLE
postgres=# INSERT INTO colour_names VALUES ('red', '#FF0000');
INSERT 0 1
postgres=# SELECT * FROM colour_names ;
name | rgbvalue
+
red | #FF0000
(1 row)
![Page 12: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/12.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 12
Operators
• A type needs operators• Equalitypostgres=# SELECT * FROM colour_names WHERE rgbvalue = '#FF0000';
ERROR: operator does not exist: colour = unknown
![Page 13: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/13.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 13
Equality operator
• We can borrow the implementation from built-in integer operator:
CREATE FUNCTION colour_eq (colour, colour)
RETURNS bool
LANGUAGE internal AS 'int4eq' IMMUTABLE;
CREATE OPERATOR = (
PROCEDURE = colour_eq,
LEFTARG = colour, RIGHTARG = colour,
HASHES, MERGES);
![Page 14: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/14.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 14
Operators
• Ok, now it works:postgres=# SELECT * FROM colour_names WHERE rgbvalue = '#FF0000';
name | rgbvalue
+
red | #FF0000
(1 row)
![Page 15: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/15.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 15
More functions
CREATE FUNCTION red(colour) RETURNS int4 LANGUAGE C AS 'MODULE_PATHNAME' IMMUTABLE;
CREATE FUNCTION green(colour) RETURNS int4 LANGUAGE C AS 'MODULE_PATHNAME' IMMUTABLE;
CREATE FUNCTION blue(colour) RETURNS int4 LANGUAGE C AS 'MODULE_PATHNAME' IMMUTABLE;
![Page 16: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/16.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 16
Luminence
CREATE FUNCTION luminence(colour)
RETURNS numeric AS
$$SELECT 0.3 * red($1) + 0.59 * green($1) + 0.11 * blue($1)
$$
LANGUAGE SQL IMMUTABLE STRICT;
![Page 17: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/17.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 17
Summary so far
• We have created a type– With input and output functions– With equality operator– With functions for splitting a colour into components and
calculating luminence
![Page 18: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/18.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 18
Ordering
postgres=# SELECT * FROM colour_names ORDER BY rgbvalue;
ERROR: could not identify an ordering operator for type colour
LINE 1: SELECT * FROM colour_names ORDER BY rgbvalue;
^
HINT: Use an explicit ordering operator or modify the query.
• We need to define an ordering operator!
![Page 19: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/19.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 19
Ordering operator
• What is an ordering operator?– <– <=– = (we already did this)
– >=– >
• We're going to define order of colours in terms of luminence
![Page 20: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/20.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 20
Implementing functions
• CREATE FUNCTION colour_lt (colour, colour) RETURNS bool AS $$ SELECT luminence($1) < luminence($2); $$ LANGUAGE SQL IMMUTABLE;
• CREATE FUNCTION colour_le (colour, colour) RETURNS bool AS $$ SELECT luminence($1) <= luminence($2); $$ LANGUAGE SQL IMMUTABLE;
• CREATE FUNCTION colour_ge (colour, colour) RETURNS bool AS $$ SELECT luminence($1) >= luminence($2); $$ LANGUAGE SQL IMMUTABLE;
• CREATE FUNCTION colour_gt (colour, colour) RETURNS bool AS $$ SELECT luminence($1) > luminence($2); $$ LANGUAGE SQL IMMUTABLE;
![Page 21: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/21.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 21
Create operators
• CREATE OPERATOR < (LEFTARG=colour, RIGHTARG=colour, PROCEDURE=colour_lt);
• CREATE OPERATOR <= (LEFTARG=colour, RIGHTARG=colour, PROCEDURE=colour_le);
• CREATE OPERATOR >= (LEFTARG=colour, RIGHTARG=colour, PROCEDURE=colour_ge);
• CREATE OPERATOR > (LEFTARG=colour, RIGHTARG=colour, PROCEDURE=colour_gt);
![Page 22: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/22.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 22
One more thing..
• We'll also need a comparison function that returns -1, 0, or 1 depending on which argument is greater
CREATE FUNCTION luminence_cmp(colour, colour)
RETURNS integer AS $$
SELECT CASE WHEN $1 = $2 THEN 0
WHEN luminence($1) < luminence($2) THEN 1
ELSE 1 END;
$$ LANGUAGE SQL IMMUTABLE;
![Page 23: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/23.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 23
Operator class
• Ok, we're ready to create an operator class!
CREATE OPERATOR CLASS luminence_opsDEFAULT FOR TYPE colour USING btree ASOPERATOR 1 <,OPERATOR 2 <=,OPERATOR 3 =,OPERATOR 4 >=,OPERATOR 5 >,FUNCTION 1 luminence_cmp(colour, colour);
![Page 24: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/24.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 24
Ready to order!
postgres=# SELECT * FROM colour_names ORDER BY rgbvalue;
name | rgbvalue
+
white | #FFFFFF
light grey | #C0C0C0
lawn green | #87F717
green | #00FF00
dark grey | #808080
red | #FF0000
blue | #0000FF
black | #000000
(8 rows)
![Page 25: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/25.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 25
Indexing
• We already created a b-tree operator class
CREATE INDEX colour_lum_index ON colour_names (rgbvalue);
postgres=# explain SELECT * FROM colour_names WHERE rgbvalue = '#000000'; QUERY PLAN -------------------------------------------------------------------------------------- Index Scan using colour_lum_index on colour_names (cost=0.00..8.32 rows=4 width=36) Index Cond: (rgbvalue = '#000000'::colour)(2 rows)
![Page 26: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/26.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 26
Plain ordering is dull
• Ordering by luminence is nice• But what about finding a colour that's the closest
match to given colour?
![Page 27: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/27.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 27
Distance function
CREATE FUNCTION colour_diff (colour, colour) RETURNS float AS $$SELECT sqrt((red($1) - red($2))^2 + (green($1) - green($2))^2 + (blue($1) - blue($2))^2)$$ LANGUAGE SQL;
CREATE OPERATOR <-> (PROCEDURE = colour_diff, LEFTARG=colour, RIGHTARG=colour);
![Page 28: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/28.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 28
Using the distance operator
postgres=# SELECT * FROM colour_names ORDER BY rgbvalue <> '#00FF00';
name | rgbvalue
+
green | #00FF00
lawn green | #87F717
dark grey | #808080
black | #000000
light grey | #C0C0C0
white | #FFFFFF
blue | #0000FF
red | #FF0000
(8 rows)
![Page 29: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/29.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 29
GiST
• Generalized Search Tree• You have to write support functions
– Like we did for b-tree
![Page 30: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/30.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 30
GiST support functions
• GiST needs 8 support functions:– Consistent– Union– Compress– Decompress– Penalty– Picksplit– Same– Distance (optional)
![Page 31: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/31.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 31
GiST support functions
• Consistent– Is search key consistent with stored key– For example, does rectangle X contain point Y
![Page 32: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/32.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 32
GiST support functions
• Union– Given two keys, return a key that represents the union
of the two keys– For example, given a rectangle and a point, return a new
bounding box rectangle that contains both
![Page 33: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/33.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 33
GiST support functions
• Compress– Given an input key, compress it into compact form that
can be stored on disk
• Decompress– The opposite
![Page 34: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/34.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 34
GiST support functions
• Penalty– How bad would it be to insert key X to page Y– Usually defined using a distance function
![Page 35: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/35.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 35
GiST support functions
• Picksplit– Given a bunch of keys, what's the best way to split them
into two sets of roughly same size?
![Page 36: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/36.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 36
GiST support functions
• Same– = equals
![Page 37: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/37.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 37
GiST support functions
• Distance (optional)– How far is key X from key Y– For example, how far is a point from a bounding box– Enables k nearest neighbors search– New in PostgreSQL 9.1
![Page 38: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/38.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 38
GiST Summary
• Implement the support functions:– Consistent, Union, Compress, Decompress, Penalty,
Picksplit, Same, Distance (optional)
• Handles– WAL-logging– Concurrency– Isolation– Durability– Transactions
![Page 39: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/39.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 39
GIN
• Generalized Inverted Index• Splits input key into multiple parts, and indexes
the parts• For example
– Full text search– Arrays– Word similarity (pg_trgm)
![Page 40: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/40.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 40
Wait, there's more!
• Binary I/O routines• Casts• Cross-datatype operators• Hash function
![Page 41: Writing a user-defined type on PostgreSQL Heikki …wiki.postgresql.org/images/1/11/FOSDEM2011-Writing_a...Copyright 2009 EnterpriseDB Corporation. All rights Reserved.](https://reader034.fdocuments.net/reader034/viewer/2022042021/5e780dc0b25e7654c62e693b/html5/thumbnails/41.jpg)
Copyright 2009 EnterpriseDB Corporation. All rights Reserved.<presentation title goes here, edit in the slide master > Slide: 41
Summary
• You're the expert in your problem domain• You define the semantics• PostgreSQL handles the rest