Come definire un nuovo tipo di dati ormai si vede tutti i giorni ma come poter fare l'overloading degli operatori e del casting penso siano grandi feature che PostgreSQL offre ai propri utenti, quelle cioè che fanno definire PostgreSQL un object-relation database.
Queste funzionalità non sono state implementate per dimostrare le capacità del team di sviluppo di PostgreSQL (che ovviamente nessuno mette in dubbio, anzi...) ma hanno risvolti importanti nella programmazione di tutti i giorni: possiamo infatti fare un lookup di una tabella con una funzione di conversione oppure manipolare i codici di errore custom tramite l'overloading degli operatori, questi (e non molto altro dato il tempo a disposizione) saranno gli esempi che porteremo per dimostrare la potenza di questi costrutti.
E' un talk con molto codice per cui ci aspettiamo grande partecipazioni di sviluppatori ansiosi di assimilare nuovi spunti, ma anche di sistemisti, che vogliono ampliare la propria visione di insieme, e a maggior ragione, i manager che vogliono capire la direzione da far prendere ai prossimi investimenti.
Postgre sql custom datatype overloading operator and casting
1. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 1) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
1
Andrea Adami
mi potete trovare su:
blog: http://www.folstuff.eu
github: https://github.com/folstuff
linkedin: https://www.linkedin.com/in/andreaadami/it
instagram: https://www.instagram.com/folstuff
facebook: https://www.facebook.com/folstuff
google+: https://plus.google.com/+AndreaAdamiProfile
twitter @folstuff : https://twitter.com/folstuff
slideshare: https://www.slideshare.net/andreaadami
PostgreSQL
custom
DATATYPE
mi potete trovare su:
blog: http://www.folstuff.eu
github: https://github.com/folstuff
linkedin: https://www.linkedin.com/in/andreaadami/it
instagram: https://www.instagram.com/folstuff
facebook: https://www.facebook.com/folstuff
google+: https://plus.google.com/+AndreaAdamiProfile
twitter @folstuff : https://twitter.com/folstuff
slideshare: https://www.slideshare.net/andreaadami
mi potete trovare su:
blog: http://www.folstuff.eu
github: https://github.com/folstuff
linkedin: https://www.linkedin.com/in/andreaadami/it
instagram: https://www.instagram.com/folstuff
facebook: https://www.facebook.com/folstuff
google+: https://plus.google.com/+AndreaAdamiProfile
twitter @folstuff : https://twitter.com/folstuff
slideshare: https://www.slideshare.net/andreaadami
operator
overloading
and
casting
2. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 2) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
2
Andrea Adami
Andrea Adami (https://it.linkedin.com/in/andreaadami) si
definisce un "Architetto di Soluzioni"
Si innamora di un Commodore 64 trovato sotto l'albero di
Natale nel 1980 e vive tutta l'evoluzione dell'informatica
dai grossi calcolatori per banche e assicurazioni fino a
internet a alle reti di personal computer passando dai
microcontrollori quando IoT era un acronimo a cui non si
sapeva quale parola collegare.
La cosa fuori dal comune e che dopo oltre 30 anni è
ancora sinceramente appasionato dalla programmazione
e gli piace trasmettere questa sua passione.
Nel tempo libero costruisce e fa' volare aeromodelli.
Tiene un blog all'indirizzo: http:www.folstuff.eu
3. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 3) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
3
PostegreSQL
The world's most advanced open source database
4. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 4) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
4
Data Type Built-in
1. Numeric Types
1.1. Integer Types
1.2. Arbitrary Precision Numbers
1.3. Floating-Point Types
1.4. Serial Types
2. Monetary Types
3. Character Types
4. Binary Data Types
4.1. bytea Hex Format
4.2. bytea Escape Format
5. Date/Time Types
5.1. Date/Time Input
5.2. Date/Time Output
5.3. Time Zones
5.4. Interval Input
5.5. Interval Output
6. Boolean Type
7. Enumerated Types
7.1. Declaration of Enumerated Types
7.2. Ordering
7.3. Type Safety
7.4. Implementation Details
8. Geometric Types
8.1. Points
8.2. Line Segments
8.3. Boxes
8.4. Paths
8.5. Polygons
8.6. Circles
9. Network Address Types
9.1. inet
9.2. cidr
9.3. inet vs. cidr
9.4. macaddr
5. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 5) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
5
Data Type Built-in
10. Bit String Types
11. Text Search Types
11.1. tsvector
11.2. tsquery
12. UUID Type
13. XML Type
13.1. Creating XML Values
13.2. Encoding Handling
13.3. Accessing XML Values
14. JSON Type
15. Arrays
15.1. Declaration of Array Types
15.2. Array Value Input
15.3. Accessing Arrays
15.4. Modifying Arrays
15.5. Searching in Arrays
15.6. Array Input and Output Syntax
16. Composite Types
16.1. Declaration of Composite Types
16.2. Constructing Composite Values
16.3. Accessing Composite Types
16.4. Modifying Composite Types
16.5. Using Composite Types in Queries
16.6. Composite Type Input and Output Syntax
17. Range Types
17.1. Built-in Range Types
17.2. Examples
17.3. Inclusive and Exclusive Bounds
17.4. Infinite (Unbounded) Ranges
17.5. Range Input/Output
17.6. Constructing Ranges
17.7. Discrete Range Types
17. Defining New Range Types
17.9. Indexing
6. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 6) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
6
Data Type ARRAY
7. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 7) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
7
Es: inet Data Type
CREATE TABLE datasets.ip_addresses
(
ip_address bigint NOT NULL DEFAULT nextval('datasets.pk_seq'::regclass),
from_ip inet NOT NULL,
to_ip inet NOT NULL,
country character varying(2) NOT NULL,
CONSTRAINT ip_addresses_pk PRIMARY KEY (ip_address)
)
8. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 8) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
8
Es: inet Data Type
INSERT INTO datasets.ip_addresses(from_ip, to_ip, country) VALUES ('1.1.1.0', '1.1.1.255','IT');
INSERT INTO datasets.ip_addresses(from_ip, to_ip, country) VALUES ('2.1.1.0', '2.1.1.255','GB');
INSERT INTO datasets.ip_addresses(from_ip, to_ip, country) VALUES ('3.1.1.0', '3.1.1.255','AR');
9. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 9) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
9
Es: inet Data Type
INSERT INTO datasets.ip_addresses(from_ip, to_ip, country) VALUES ('3.1.1.260', '3.1.1.255','AR');
ERRORE: sintassi di input non valida per il tipo inet: "3.1.1.260"
RIGA 1: ...ets.ip_addresses(from_ip, to_ip, country) VALUES ('3.1.1.260...
^
********** Error **********
ERRORE: sintassi di input non valida per il tipo inet: "3.1.1.260"
SQL state: 22P02
Character: 68
10. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 10) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
10
Es: inet Data Type
SELECT * FROM datasets.ip_addresses WHERE from_ip = inet '1.32.202.128';
SELECT * FROM datasets.ip_addresses WHERE from_ip << inet '1.32.202/24';
SELECT * FROM datasets.ip_addresses WHERE from_ip << inet '1.32.202/23';
11. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 11) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
11
RANGE built-in
int4range — Range of integer
int8range — Range of bigint
numrange — Range of numeric
tsrange — Range of timestamp without time zone
tstzrange — Range of timestamp with time zone
daterange — Range of date
12. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 12) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
12
RANGE OPERATORS
13. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 13) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
13
RANGE built-in
CREATE TABLE scuola247.school_years
(
school_year bigint NOT NULL DEFAULT nextval('scuola247.pk_seq'::regclass), -- Unique
identification code for the row
school bigint NOT NULL, -- School
description character varying(160) NOT NULL, -- The description for the school year
duration daterange, -- The duration for the school year
lessons_duration daterange, -- The duration of the lessons
CONSTRAINT school_years_pk PRIMARY KEY (school_year),
CONSTRAINT school_years_fk_school FOREIGN KEY (school)
REFERENCES scuola247.schools (school) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT school_years_ex_duration EXCLUDE
USING gist (school WITH =, duration WITH &&), -- in the same school we cannot have duration
overlap
CONSTRAINT school_years_uq_description UNIQUE (school, description), -- La description
deve essere univoca all'interno di un school
CONSTRAINT school_years_ck_description CHECK (length(btrim(description::text)) > 0),
CONSTRAINT school_years_ck_duration CHECK (duration @> lessons_duration))
14. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 14) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
14
custom
datatype
15. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 15) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
15
CREATE TYPE
CREATE TYPE name AS
( [ attribute_name data_type [ COLLATE collation ] [, ... ] ] )
CREATE TYPE name AS ENUM
( [ 'label' [, ... ] ] )
CREATE TYPE name AS RANGE (
SUBTYPE = subtype
[ , SUBTYPE_OPCLASS = subtype_operator_class ]
[ , COLLATION = collation ]
[ , CANONICAL = canonical_function ]
[ , SUBTYPE_DIFF = subtype_diff_function ]
)
17. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 17) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
17
CREATE TYPE
CREATE TYPE sex AS ENUM
('M',
'F');
18. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 18) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
18
SEX
https://de.wikipedia.org/wiki/Datenstandards_zur_Beschreibung_des_Geschlechts
19. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 19) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
19
CREATE TYPE
CREATE TYPE sex AS ENUM
('m',
'f',
'?',
'h',
'sh',
'mc'
'fc',
'hm',
'hf',
'ht',
'i',
'a',
'x',
'-');
20. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 20) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
20
CREATE DOMAIN
CREATE DOMAIN name [ AS ] data_type
[ COLLATE collation ]
[ DEFAULT expression ]
[ constraint [ ... ] ]
where constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }
21. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 21) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
21
Es: CREATE DOMAIN
CREATE TYPE utility.mime_type AS ENUM
('application/json',
'application/octet-stream',
'application/pdf',
'text/plain',
'image/png',
'image/jpg',
'image/bmp',
'image/gif',
'text/html');
22. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 22) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
22
Es: CREATE DOMAIN
CREATE DOMAIN utility.mime_type_image AS utility.mime_type
CONSTRAINT mime_type_image_is_not_null CHECK (VALUE IS NOT NULL)
CONSTRAINT mime_type_image_list CHECK (VALUE = ANY (ARRAY[
'image/png'::utility.mime_type,
'image/jpg'::utility.mime_type,
'image/bmp'::utility.mime_type,
'image/gif'::utility.mime_type]));
23. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 23) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
23
(SYSTEM’S COLUMNS)
oid
The object identifier (object ID) of a row. This column is only present if the table was created using WITH OIDS, or if the
default_with_oids configuration variable was set at the time. This column is of type oid (same name as the column); see Section
8.19 for more information about the type.
tableoid
The OID of the table containing this row. This column is particularly handy for queries that select from inheritance hierarchies
(see Section 5.9), since without it, it's difficult to tell which individual table a row came from. The tableoid can be joined against
the oid column of pg_class to obtain the table name.
xmin
The identity (transaction ID) of the inserting transaction for this row version. (A row version is an individual state of a row; each
update of a row creates a new row version for the same logical row.)
cmin
The command identifier (starting at zero) within the inserting transaction.
xmax
The identity (transaction ID) of the deleting transaction, or zero for an undeleted row version. It is possible for this column to be
nonzero in a visible row version. That usually indicates that the deleting transaction hasn't committed yet, or that an attempted
deletion was rolled back.
cmax
The command identifier within the deleting transaction, or zero.
ctid
The physical location of the row version within its table. Note that although the ctid can be used to locate the row version very
quickly, a row's ctid will change if it is updated or moved by VACUUM FULL. Therefore ctid is useless as a long-term row
identifier. The OID, or even better a user-defined serial number, should be used to identify logical rows.
24. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 24) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
24
SYSTEM’S COLUMNS
(test)
SELECT *
FROM pg_proc
WHERE proname like 'count_value'
SELECT oid,*
FROM pg_proc
WHERE proname like 'count_value'
SELECT *
FROM pg_proc
WHERE oid = 6348558
25. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 25) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
25
OBJECT IDENTIFIER
26. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 26) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
26
OBJECT IDENTIFIER
(test)
SELECT 6348558::oid::regproc
SELECT 6348558::oid::regprocedure
27. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 27) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
27
casting
::
28. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 28) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
28
CREATE CAST
CREATE CAST (source_type AS target_type)
WITH FUNCTION function_name (argument_type [, ...])
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (source_type AS target_type)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (source_type AS target_type)
WITH INOUT
[ AS ASSIGNMENT | AS IMPLICIT ]
29. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 29) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
29
Es: CREATE CAST
CREATE TYPE utility.file_extension AS ENUM
('.json',
'.exe',
'.pdf',
'.txt',
'.png',
'.jpg',
'.bmp',
'.gif',
'.html');
30. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 30) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
30
Es: CREATE CAST
CREATE CAST (utility.mime_type AS utility.file_extension)
WITH FUNCTION utility.file_extension(utility.mime_type)
AS IMPLICIT;
31. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 31) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
31
Es: CREATE CAST
CREATE OR REPLACE FUNCTION utility.file_extension(p_mime_type utility.mime_type)
RETURNS utility.file_extension AS
$BODY$
<<me>>
DECLARE
context text;
full_function_name text;
system_messages utility.system_message[] = ARRAY[
('en', 1, 'Cast error')::utility.system_message,
('en', 2, 'Cannot cast value: ''%s'' to data type ''file_extension'' because it isn''t in the conversion rule')::utility.system_message,
('en', 3, 'Check the parameter''s value and retry the operation')::utility.system_message,
('it', 1, 'Errore di conversione')::utility.system_message,
('it', 2, 'Non è possibile convertire il valore: ''%s'' nel tipo dato: ''file_extension'' perchè non è previsto dalla regola di conversione ')::utility.system_message,
('it', 3, 'Controllare il valore specificato e riprovare l''operazione')::utility.system_message];
BEGIN
--
-- Retrieve the name of the function
--
GET DIAGNOSTICS me.context = PG_CONTEXT;
full_function_name = diagnostic.full_function_name(context);
CASE p_mime_type
WHEN 'application/json' THEN RETURN '.json'::utility.file_extension;
WHEN 'application/octet-stream' THEN RETURN '.exe'::utility.file_extension;
WHEN 'application/pdf' THEN RETURN '.pdf'::utility.file_extension;
WHEN 'text/plain' THEN RETURN '.txt'::utility.file_extension;
WHEN 'image/png' THEN RETURN '.png'::utility.file_extension;
WHEN 'image/jpg' THEN RETURN '.jpg'::utility.file_extension;
WHEN 'image/bmp' THEN RETURN '.bmp'::utility.file_extension;
WHEN 'image/gif' THEN RETURN '.gif'::utility.file_extension;
WHEN 'text/html' THEN RETURN '.html'::utility.file_extension;
WHEN NULL THEN RETURN NULL::utility.file_extension;
ELSE RAISE EXCEPTION USING
ERRCODE = diagnostic.my_sqlcode(full_function_name,'1'),
MESSAGE = utility.system_messages_locale(system_messages,1),
DETAIL = format(utility.system_messages_locale(system_messages,2), p_mime_type),
HINT = utility.system_messages_locale(system_messages,3);
END CASE;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
32. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 32) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
32
Es: CREATE CAST
CASE p_mime_type
WHEN 'application/json' THEN RETURN '.json'::utility.file_extension;
WHEN 'application/octet-stream' THEN RETURN '.exe'::utility.file_extension;
WHEN 'application/pdf' THEN RETURN '.pdf'::utility.file_extension;
WHEN 'text/plain' THEN RETURN '.txt'::utility.file_extension;
WHEN 'image/png' THEN RETURN '.png'::utility.file_extension;
WHEN 'image/jpg' THEN RETURN '.jpg'::utility.file_extension;
WHEN 'image/bmp' THEN RETURN '.bmp'::utility.file_extension;
WHEN 'image/gif' THEN RETURN '.gif'::utility.file_extension;
WHEN 'text/html' THEN RETURN '.html'::utility.file_extension;
WHEN NULL THEN RETURN NULL::utility.file_extension;
ELSE RAISE EXCEPTION USING
ERRCODE = diagnostic.my_sqlcode(full_function_name,'1'),
MESSAGE = utility.system_messages_locale(system_messages,1),
DETAIL = format(utility.system_messages_locale(system_messages,2),
p_mime_type),
HINT = utility.system_messages_locale(system_messages,3);
END CASE;
33. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 33) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
33
CREATE CAST
(test)
SELECT 'application/pdf'::utility.mime_type
SELECT 'application/xxx'::utility.mime_type
SELECT '.pdf'::utility.file_extension
SELECT '.xxx'::utility.file_extension
SELECT 'application/pdf'::utility.mime_type::utility.file_extension
34. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 34) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
34
CREATE CAST
(test)
SELECT 'application/pdf'::utility.mime_type
SELECT 'application/xxx'::utility.mime_type
SELECT '.pdf'::utility.file_extension
SELECT '.xxx'::utility.file_extension
SELECT 'application/pdf'::utility.mime_type::utility.file_extension
35. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 35) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
35
CREATE CAST
(continue)
CREATE CAST (utility.mime_type AS utility.file_extension)
WITH FUNCTION utility.file_extension(utility.mime_type)
AS IMPLICIT;
CREATE CAST (utility.file_extension AS utility.mime_type)
WITH FUNCTION utility.mime_type(utility.file_extension)
AS IMPLICIT;
36. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 36) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
36
PUBLICITÀ
37. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 37) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
37
CREATE CAST
UNA TABELLA È UN TIPO
38. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 38) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
38
Es: CREATE CAST/2
CREATE CAST (integer AS scuola247.schools)
WITH FUNCTION scuola247.schools_lookup(integer)
AS IMPLICIT;
39. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 39) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
39
Es: CREATE CAST/2
SELECT school, description, processing_code, mnemonic, example,
behavior
INTO _schools.school, _schools.description, _schools.processing_code,
_schools.mnemonic, _schools.example, _schools.behavior
FROM schools
WHERE school = _school;
IF NOT FOUND THEN
RAISE EXCEPTION USING
ERRCODE = diagnostic.my_sqlcode(full_function_name,'1'),
MESSAGE = utility.system_messages_locale(system_messages,1),
DETAIL = format(utility.system_messages_locale(system_messages,2),
_school),
HINT = utility.system_messages_locale(system_messages,3);
END IF;
40. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 40) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
40
CREATE CAST/2
(test)
SELECT * FROM scuola247.schools;
SELECT 1::scuola247.schools;
SELECT 28961::scuola247.schools;
SELECT (1::scuola247.schools).description;
SELECT (1::scuola247.schools).*;
SELECT (1::scuola247.schools).behavior::scuola247.subjects;
SELECT ((1::scuola247.schools).behavior::scuola247.subjects).*;
SELECT ((1::scuola247.schools).behavior::scuola247.subjects).*;
SELECT (1::scuola247.schools).*,
((1::scuola247.schools).behavior::scuola247.subjects).*;
41. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 41) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
41
operator
overloading
+ - * :
43. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 43) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
43
OVERLOADING
CREATE DOMAIN utility.number_base34
AS character varying(12)
COLLATE pg_catalog."default"
CONSTRAINT number_base34_check_characters CHECK (VALUE::text ~
similar_escape('[0-9A-HJ-NP-Z]{0,12}'::text, NULL::text));
ALTER DOMAIN utility.number_base34
OWNER TO scuola247_supervisor;
COMMENT ON DOMAIN utility.number_base34
44. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 44) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
44
OVERLOADING
(test1)
SELECT 'ABCD'::utility.number_base34;
SELECT '123456789012'::utility.number_base34;
SELECT '1234567890123'::utility.number_base34; -- nota la troncatura
SELECT 'AAAAAAAAAAAAB'::utility.number_base34; -- nota la troncatura
SELECT 'ABCDEFGHILMN'::utility.number_base34; -- errore per I (si può confondere con 1)
SELECT 'ABCDEFGHLMNO'::utility.number_base34; -- errore per o (si può confondere con 0)
SELECT 'ABCDEFGHLMNP'::utility.number_base34;
SELECT 'ABCDEFGHLMNPQ'::utility.number_base34; -- nota la troncatura
45. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 45) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
45
OVERLOADING
CREATE OPERATOR utility.+(
PROCEDURE = utility.number_base34_pl,
LEFTARG = number_base34,
RIGHTARG = int4);
46. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 46) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
46
OVERLOADING
CREATE OR REPLACE FUNCTION utility.number_base34_pl(
utility.number_base34,
integer)
RETURNS utility.number_base34 AS
$BODY$
DECLARE
BEGIN
RETURN utility.number_base34(utility.int8($1) + $2);
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 1;
47. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 47) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
47
OVERLOADING
SELECT 'ABCDEFG'::number_base34
SELECT ('ABCDEFG'::number_base34)+1 – il risultato sarà: ABCDEFH
SELECT ('ABCDEFH'::number_base34)+1 -- il risultato sarà: ABCDEFJ (si evita la 'I')
48. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 48) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
48
Bibliografia
https://www.postgresql.org/docs/
49. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 49) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
49
Q&A
Domande
e (si spera)
Risposte
50. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 50) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
50
FINE
grazie per l'attenzione!
These slides are subjected to license Creative Commons
Attribution Share Alike 4.0 International (CC BY-SA 4.0)