SlideShare a Scribd company logo
1 of 50
Download to read offline
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
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
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
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
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
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
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)
)
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');
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
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';
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
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
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))
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
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 ]
)
01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 16) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
16
CREATE TYPE
CREATE TYPE name (
INPUT = input_function,
OUTPUT = output_function
[ , RECEIVE = receive_function ]
[ , SEND = send_function ]
[ , TYPMOD_IN = type_modifier_input_function ]
[ , TYPMOD_OUT = type_modifier_output_function ]
[ , ANALYZE = analyze_function ]
[ , INTERNALLENGTH = { internallength | VARIABLE } ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = alignment ]
[ , STORAGE = storage ]
[ , LIKE = like_type ]
[ , CATEGORY = category ]
[ , PREFERRED = preferred ]
[ , DEFAULT = default ]
[ , ELEMENT = element ]
[ , DELIMITER = delimiter ]
[ , COLLATABLE = collatable ]
)
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');
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
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',
'-');
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) }
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');
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]));
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.
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
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
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
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
::
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 ]
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');
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;
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;
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;
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
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
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;
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À
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
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;
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;
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).*;
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
+ - * :
01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 42) www.folstuff.eu
www.itpug.orgwww.endsummercamp.org
ESC-2K18
Forte Bazzera (VE)
www.endsummercamp.orgwww.endsummercamp.org
42
OVERLOADING
CREATE OPERATOR name (
PROCEDURE = function_name
[, LEFTARG = left_type ] [, RIGHTARG = right_type ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, MERGES ]
)
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
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
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);
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;
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')
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/
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
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)

More Related Content

Similar to Postgre sql custom datatype overloading operator and casting

Incubating Apache Hivemall
Incubating Apache HivemallIncubating Apache Hivemall
Incubating Apache HivemallMakoto Yui
 
How elephants survive in big data environments
How elephants survive in big data environmentsHow elephants survive in big data environments
How elephants survive in big data environmentsMary Prokhorova
 
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018Sunaina Pai
 
Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Eugene Lazutkin
 
Artem Storozhuk "Building SQL firewall: insights from developers"
Artem Storozhuk "Building SQL firewall: insights from developers"Artem Storozhuk "Building SQL firewall: insights from developers"
Artem Storozhuk "Building SQL firewall: insights from developers"Fwdays
 
More Data Science with Less Engineering: Machine Learning Infrastructure at N...
More Data Science with Less Engineering: Machine Learning Infrastructure at N...More Data Science with Less Engineering: Machine Learning Infrastructure at N...
More Data Science with Less Engineering: Machine Learning Infrastructure at N...Ville Tuulos
 
扩展世界上最大的图片Blog社区
扩展世界上最大的图片Blog社区扩展世界上最大的图片Blog社区
扩展世界上最大的图片Blog社区yiditushe
 
Fotolog: Scaling the World's Largest Photo Blogging Community
Fotolog: Scaling the World's Largest Photo Blogging CommunityFotolog: Scaling the World's Largest Photo Blogging Community
Fotolog: Scaling the World's Largest Photo Blogging Communityfarhan "Frank"​ mashraqi
 
Sparklyr: Big Data enabler for R users
Sparklyr: Big Data enabler for R usersSparklyr: Big Data enabler for R users
Sparklyr: Big Data enabler for R usersICTeam S.p.A.
 
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAM
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAMSparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAM
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAMData Science Milan
 
Presto: Optimizing Performance of SQL-on-Anything Engine
Presto: Optimizing Performance of SQL-on-Anything EnginePresto: Optimizing Performance of SQL-on-Anything Engine
Presto: Optimizing Performance of SQL-on-Anything EngineDataWorks Summit
 
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG 2017...
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG  2017...SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG  2017...
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG 2017...Amazon Web Services
 
20110114 Next Generation Sequencing Course
20110114 Next Generation Sequencing Course20110114 Next Generation Sequencing Course
20110114 Next Generation Sequencing CoursePierre Lindenbaum
 
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!Streaming ML on Spark: Deprecated, experimental and internal ap is galore!
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!Holden Karau
 
Eta lang Beauty And The Beast
Eta lang Beauty And The Beast Eta lang Beauty And The Beast
Eta lang Beauty And The Beast Jarek Ratajski
 
Best Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesBest Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesOdoo
 
pg_loader | Nordic PGDay 2018 | Dimitri Fontaine
pg_loader | Nordic PGDay 2018 | Dimitri Fontainepg_loader | Nordic PGDay 2018 | Dimitri Fontaine
pg_loader | Nordic PGDay 2018 | Dimitri FontaineCitus Data
 

Similar to Postgre sql custom datatype overloading operator and casting (20)

Incubating Apache Hivemall
Incubating Apache HivemallIncubating Apache Hivemall
Incubating Apache Hivemall
 
How elephants survive in big data environments
How elephants survive in big data environmentsHow elephants survive in big data environments
How elephants survive in big data environments
 
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018
From Writing to Publishing makesite.py - Sunaina Pai - PyCon UK 2018
 
Coding Ajax
Coding AjaxCoding Ajax
Coding Ajax
 
Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.
 
Artem Storozhuk "Building SQL firewall: insights from developers"
Artem Storozhuk "Building SQL firewall: insights from developers"Artem Storozhuk "Building SQL firewall: insights from developers"
Artem Storozhuk "Building SQL firewall: insights from developers"
 
Coding Ajax
Coding AjaxCoding Ajax
Coding Ajax
 
More Data Science with Less Engineering: Machine Learning Infrastructure at N...
More Data Science with Less Engineering: Machine Learning Infrastructure at N...More Data Science with Less Engineering: Machine Learning Infrastructure at N...
More Data Science with Less Engineering: Machine Learning Infrastructure at N...
 
扩展世界上最大的图片Blog社区
扩展世界上最大的图片Blog社区扩展世界上最大的图片Blog社区
扩展世界上最大的图片Blog社区
 
Fotolog: Scaling the World's Largest Photo Blogging Community
Fotolog: Scaling the World's Largest Photo Blogging CommunityFotolog: Scaling the World's Largest Photo Blogging Community
Fotolog: Scaling the World's Largest Photo Blogging Community
 
Sparklyr: Big Data enabler for R users
Sparklyr: Big Data enabler for R usersSparklyr: Big Data enabler for R users
Sparklyr: Big Data enabler for R users
 
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAM
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAMSparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAM
Sparklyr: Big Data enabler for R users - Serena Signorelli, ICTEAM
 
Presto: Optimizing Performance of SQL-on-Anything Engine
Presto: Optimizing Performance of SQL-on-Anything EnginePresto: Optimizing Performance of SQL-on-Anything Engine
Presto: Optimizing Performance of SQL-on-Anything Engine
 
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG 2017...
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG  2017...SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG  2017...
SQL Strikes Back! Options for Large Scale SQL Analytics - AWS Summit SG 2017...
 
20110114 Next Generation Sequencing Course
20110114 Next Generation Sequencing Course20110114 Next Generation Sequencing Course
20110114 Next Generation Sequencing Course
 
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!Streaming ML on Spark: Deprecated, experimental and internal ap is galore!
Streaming ML on Spark: Deprecated, experimental and internal ap is galore!
 
Eta lang Beauty And The Beast
Eta lang Beauty And The Beast Eta lang Beauty And The Beast
Eta lang Beauty And The Beast
 
Best Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesBest Practices in Handling Performance Issues
Best Practices in Handling Performance Issues
 
pg_loader | Nordic PGDay 2018 | Dimitri Fontaine
pg_loader | Nordic PGDay 2018 | Dimitri Fontainepg_loader | Nordic PGDay 2018 | Dimitri Fontaine
pg_loader | Nordic PGDay 2018 | Dimitri Fontaine
 
Python and Sage
Python and SagePython and Sage
Python and Sage
 

More from Andrea Adami

Jugpd meeting#76 Unit Testing with PostgreSQL
Jugpd meeting#76 Unit Testing with PostgreSQLJugpd meeting#76 Unit Testing with PostgreSQL
Jugpd meeting#76 Unit Testing with PostgreSQLAndrea Adami
 
Sistemi Operativi Liberi TUTTI li devono conoscere
Sistemi Operativi Liberi TUTTI li devono conoscereSistemi Operativi Liberi TUTTI li devono conoscere
Sistemi Operativi Liberi TUTTI li devono conoscereAndrea Adami
 
Imparare a programmare
Imparare a programmareImparare a programmare
Imparare a programmareAndrea Adami
 
PostgreSQL Day italy 2016 Unit Test
PostgreSQL Day italy 2016 Unit TestPostgreSQL Day italy 2016 Unit Test
PostgreSQL Day italy 2016 Unit TestAndrea Adami
 
La licenza aperta come garanzia
La licenza aperta come garanziaLa licenza aperta come garanzia
La licenza aperta come garanziaAndrea Adami
 
Come il tipo di licenza incide nel tco di un computer
Come il tipo di licenza incide nel tco di un computerCome il tipo di licenza incide nel tco di un computer
Come il tipo di licenza incide nel tco di un computerAndrea Adami
 
Joomla day 2010 Virtualizzare in locale pro e contro
Joomla day 2010 Virtualizzare in locale pro e controJoomla day 2010 Virtualizzare in locale pro e contro
Joomla day 2010 Virtualizzare in locale pro e controAndrea Adami
 
Introduzione al mondo del software libero
Introduzione al mondo del software liberoIntroduzione al mondo del software libero
Introduzione al mondo del software liberoAndrea Adami
 

More from Andrea Adami (8)

Jugpd meeting#76 Unit Testing with PostgreSQL
Jugpd meeting#76 Unit Testing with PostgreSQLJugpd meeting#76 Unit Testing with PostgreSQL
Jugpd meeting#76 Unit Testing with PostgreSQL
 
Sistemi Operativi Liberi TUTTI li devono conoscere
Sistemi Operativi Liberi TUTTI li devono conoscereSistemi Operativi Liberi TUTTI li devono conoscere
Sistemi Operativi Liberi TUTTI li devono conoscere
 
Imparare a programmare
Imparare a programmareImparare a programmare
Imparare a programmare
 
PostgreSQL Day italy 2016 Unit Test
PostgreSQL Day italy 2016 Unit TestPostgreSQL Day italy 2016 Unit Test
PostgreSQL Day italy 2016 Unit Test
 
La licenza aperta come garanzia
La licenza aperta come garanziaLa licenza aperta come garanzia
La licenza aperta come garanzia
 
Come il tipo di licenza incide nel tco di un computer
Come il tipo di licenza incide nel tco di un computerCome il tipo di licenza incide nel tco di un computer
Come il tipo di licenza incide nel tco di un computer
 
Joomla day 2010 Virtualizzare in locale pro e contro
Joomla day 2010 Virtualizzare in locale pro e controJoomla day 2010 Virtualizzare in locale pro e contro
Joomla day 2010 Virtualizzare in locale pro e contro
 
Introduzione al mondo del software libero
Introduzione al mondo del software liberoIntroduzione al mondo del software libero
Introduzione al mondo del software libero
 

Recently uploaded

Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Brighton SEO | April 2024 | Data Storytelling
Brighton SEO | April 2024 | Data StorytellingBrighton SEO | April 2024 | Data Storytelling
Brighton SEO | April 2024 | Data StorytellingNeil Barnes
 
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Sapana Sha
 
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Serviceranjana rawat
 
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdf
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdfMarket Analysis in the 5 Largest Economic Countries in Southeast Asia.pdf
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdfRachmat Ramadhan H
 
Predicting Employee Churn: A Data-Driven Approach Project Presentation
Predicting Employee Churn: A Data-Driven Approach Project PresentationPredicting Employee Churn: A Data-Driven Approach Project Presentation
Predicting Employee Churn: A Data-Driven Approach Project PresentationBoston Institute of Analytics
 
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...Florian Roscheck
 
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...soniya singh
 
Beautiful Sapna Vip Call Girls Hauz Khas 9711199012 Call /Whatsapps
Beautiful Sapna Vip  Call Girls Hauz Khas 9711199012 Call /WhatsappsBeautiful Sapna Vip  Call Girls Hauz Khas 9711199012 Call /Whatsapps
Beautiful Sapna Vip Call Girls Hauz Khas 9711199012 Call /Whatsappssapnasaifi408
 
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM TRACKING WITH GOOGLE ANALYTICS.pptx
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM  TRACKING WITH GOOGLE ANALYTICS.pptxEMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM  TRACKING WITH GOOGLE ANALYTICS.pptx
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM TRACKING WITH GOOGLE ANALYTICS.pptxthyngster
 
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfKantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfSocial Samosa
 
Dubai Call Girls Wifey O52&786472 Call Girls Dubai
Dubai Call Girls Wifey O52&786472 Call Girls DubaiDubai Call Girls Wifey O52&786472 Call Girls Dubai
Dubai Call Girls Wifey O52&786472 Call Girls Dubaihf8803863
 
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Callshivangimorya083
 
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...shivangimorya083
 
B2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxB2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxStephen266013
 
定制英国白金汉大学毕业证(UCB毕业证书) 成绩单原版一比一
定制英国白金汉大学毕业证(UCB毕业证书)																			成绩单原版一比一定制英国白金汉大学毕业证(UCB毕业证书)																			成绩单原版一比一
定制英国白金汉大学毕业证(UCB毕业证书) 成绩单原版一比一ffjhghh
 
100-Concepts-of-AI by Anupama Kate .pptx
100-Concepts-of-AI by Anupama Kate .pptx100-Concepts-of-AI by Anupama Kate .pptx
100-Concepts-of-AI by Anupama Kate .pptxAnupama Kate
 
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...Suhani Kapoor
 
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPramod Kumar Srivastava
 

Recently uploaded (20)

Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
 
Brighton SEO | April 2024 | Data Storytelling
Brighton SEO | April 2024 | Data StorytellingBrighton SEO | April 2024 | Data Storytelling
Brighton SEO | April 2024 | Data Storytelling
 
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
 
VIP Call Girls Service Charbagh { Lucknow Call Girls Service 9548273370 } Boo...
VIP Call Girls Service Charbagh { Lucknow Call Girls Service 9548273370 } Boo...VIP Call Girls Service Charbagh { Lucknow Call Girls Service 9548273370 } Boo...
VIP Call Girls Service Charbagh { Lucknow Call Girls Service 9548273370 } Boo...
 
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service
(PARI) Call Girls Wanowrie ( 7001035870 ) HI-Fi Pune Escorts Service
 
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdf
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdfMarket Analysis in the 5 Largest Economic Countries in Southeast Asia.pdf
Market Analysis in the 5 Largest Economic Countries in Southeast Asia.pdf
 
Predicting Employee Churn: A Data-Driven Approach Project Presentation
Predicting Employee Churn: A Data-Driven Approach Project PresentationPredicting Employee Churn: A Data-Driven Approach Project Presentation
Predicting Employee Churn: A Data-Driven Approach Project Presentation
 
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
 
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
 
Beautiful Sapna Vip Call Girls Hauz Khas 9711199012 Call /Whatsapps
Beautiful Sapna Vip  Call Girls Hauz Khas 9711199012 Call /WhatsappsBeautiful Sapna Vip  Call Girls Hauz Khas 9711199012 Call /Whatsapps
Beautiful Sapna Vip Call Girls Hauz Khas 9711199012 Call /Whatsapps
 
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM TRACKING WITH GOOGLE ANALYTICS.pptx
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM  TRACKING WITH GOOGLE ANALYTICS.pptxEMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM  TRACKING WITH GOOGLE ANALYTICS.pptx
EMERCE - 2024 - AMSTERDAM - CROSS-PLATFORM TRACKING WITH GOOGLE ANALYTICS.pptx
 
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfKantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
 
Dubai Call Girls Wifey O52&786472 Call Girls Dubai
Dubai Call Girls Wifey O52&786472 Call Girls DubaiDubai Call Girls Wifey O52&786472 Call Girls Dubai
Dubai Call Girls Wifey O52&786472 Call Girls Dubai
 
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call
꧁❤ Greater Noida Call Girls Delhi ❤꧂ 9711199171 ☎️ Hard And Sexy Vip Call
 
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...
Full night 🥵 Call Girls Delhi New Friends Colony {9711199171} Sanya Reddy ✌️o...
 
B2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxB2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docx
 
定制英国白金汉大学毕业证(UCB毕业证书) 成绩单原版一比一
定制英国白金汉大学毕业证(UCB毕业证书)																			成绩单原版一比一定制英国白金汉大学毕业证(UCB毕业证书)																			成绩单原版一比一
定制英国白金汉大学毕业证(UCB毕业证书) 成绩单原版一比一
 
100-Concepts-of-AI by Anupama Kate .pptx
100-Concepts-of-AI by Anupama Kate .pptx100-Concepts-of-AI by Anupama Kate .pptx
100-Concepts-of-AI by Anupama Kate .pptx
 
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...
VIP High Class Call Girls Bikaner Anushka 8250192130 Independent Escort Servi...
 
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
 

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 ] )
  • 16. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 16) www.folstuff.eu www.itpug.orgwww.endsummercamp.org ESC-2K18 Forte Bazzera (VE) www.endsummercamp.orgwww.endsummercamp.org 16 CREATE TYPE CREATE TYPE name ( INPUT = input_function, OUTPUT = output_function [ , RECEIVE = receive_function ] [ , SEND = send_function ] [ , TYPMOD_IN = type_modifier_input_function ] [ , TYPMOD_OUT = type_modifier_output_function ] [ , ANALYZE = analyze_function ] [ , INTERNALLENGTH = { internallength | VARIABLE } ] [ , PASSEDBYVALUE ] [ , ALIGNMENT = alignment ] [ , STORAGE = storage ] [ , LIKE = like_type ] [ , CATEGORY = category ] [ , PREFERRED = preferred ] [ , DEFAULT = default ] [ , ELEMENT = element ] [ , DELIMITER = delimiter ] [ , COLLATABLE = collatable ] )
  • 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 + - * :
  • 42. 01 settembre 2018 PostgreSQL custom DATATYPE overloading operator and casting: Andrea Adami (posta@folstuff.eu)(slide: 42) www.folstuff.eu www.itpug.orgwww.endsummercamp.org ESC-2K18 Forte Bazzera (VE) www.endsummercamp.orgwww.endsummercamp.org 42 OVERLOADING CREATE OPERATOR name ( PROCEDURE = function_name [, LEFTARG = left_type ] [, RIGHTARG = right_type ] [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ] [, RESTRICT = res_proc ] [, JOIN = join_proc ] [, HASHES ] [, MERGES ] )
  • 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)