CREATE SERVER dbpedia
FOREIGN DATA WRAPPER rdf_fdw
OPTIONS (endpoint 'https://dbpedia.org/sparql',
fetch_size '5');
CREATE FOREIGN TABLE public.dbpedia_cities (
uri text OPTIONS (variable '?city', nodetype 'iri'),
city_name text OPTIONS (variable '?name', nodetype 'literal', literaltype 'xsd:string'),
elevation numeric OPTIONS (variable '?elevation', nodetype 'literal', literaltype 'xsd:integer')
)
SERVER dbpedia OPTIONS (
sparql '
PREFIX dbo:
PREFIX foaf:
PREFIX dbr:
SELECT *
{
?city a dbo:City ;
foaf:name ?name ;
dbo:federalState dbr:North_Rhine-Westphalia ;
dbo:elevation ?elevation
}
ORDER BY ?name
OFFSET 7300 LIMIT 4200
');
/*
* 't1' only partially matches with 'dbpedia_cities', with columns
* 'city_name' and 'uri'.
* SERVER option 'fetch_size' will be used, as both FOREIGN TABLE and
* function call do not set 'fetch_size'.
* 'commit_page' is set to 'false', so all retrieved and inserted records
* are committed only when the transaction finishes.
*/
CREATE TABLE public.t1(id serial, city_name text, c1_null text, uri text, c2_null text);
CALL
rdf_fdw_clone_table(
foreign_table => 'public.dbpedia_cities',
target_table => 'public.t1',
verbose => true,
commit_page => false
);
SELECT * FROM public.t1;
/*
* only a single column of 't2' matches the foreign table 'dbpedia_cities'.
* reducing the 'fetch_size' to 2 and setting maximum limit of 9 records.
* the SPARQL query will be ordered by 'city_name'
*/
CREATE TABLE public.t2(id serial, foo int, bar date, city_name text);
CALL
rdf_fdw_clone_table(
foreign_table => 'public.dbpedia_cities',
target_table => 'public.t2',
fetch_size => 2,
max_records => 9,
orderby_column => 'city_name',
verbose => true,
commit_page => true
);
SELECT * FROM public.t2;
/*
* 't3' does not exist. it will be created by the function due to
* 'create_table => true' as a copy of 'dbedia_cities'
*/
CALL
rdf_fdw_clone_table(
foreign_table => 'public.dbpedia_cities',
target_table => 'public.t3',
create_table => true,
orderby_column => 'elevation',
sort_order => 'DESC',
verbose => true
);
SELECT * FROM public.t3;
/*----------------------------------------------------------------------------------------------------------*/
CREATE FOREIGN TABLE public.film (
film_id text OPTIONS (variable '?film'),
name text OPTIONS (variable '?name', language 'en'),
released date OPTIONS (variable '?released', literaltype 'xsd:date'),
runtime int OPTIONS (variable '?runtime'),
abstract text OPTIONS (variable '?abstract')
)
SERVER dbpedia OPTIONS (
log_sparql 'false',
sparql '
PREFIX dbr:
PREFIX dbp:
PREFIX dbo:
SELECT DISTINCT ?film ?name ?released ?runtime ?abstract
WHERE
{
?film a dbo:Film ;
rdfs:comment ?abstract ;
dbp:name ?name ;
dbp:released ?released ;
dbp:runtime ?runtime .
FILTER (LANG ( ?abstract ) = "en")
FILTER (datatype(?released) = xsd:date)
FILTER (datatype(?runtime) = xsd:integer)
}
OFFSET 7300 LIMIT 4200
');
/*
* 'public.heap1' only partially matches the columns of 'public.film'.
* the non-matching columns will be set to NULL.
*/
CREATE TABLE public.heap1 (id bigserial, foo text, runtime int, bar text, name varchar, released date);
CALL
rdf_fdw_clone_table(
foreign_table => 'public.film',
target_table => 'public.heap1',
orderby_column => 'released',
fetch_size => 4,
max_records => 15
);
SELECT * FROM public.heap1;
/*
* 'public.heap2' does not exist.
* it will be created, since 'create_table' is set to true.
*/
CALL
rdf_fdw_clone_table(
foreign_table => 'public.film',
target_table => 'public.heap2',
orderby_column => 'released',
create_table => true,
fetch_size => 4,
max_records => 15
);
SELECT runtime,name,released FROM public.heap2;
/*
* the matching columns of 'public.heap1' and 'public.heap2'
* must be identical
*/
SELECT runtime,name,released FROM public.heap1
EXCEPT
SELECT runtime,name,released FROM public.heap2;
/*
* setting 'begin_offset' to 10
*/
CALL
rdf_fdw_clone_table(
foreign_table => 'public.film',
target_table => 'public.heap3',
orderby_column => 'released',
create_table => true,
begin_offset => 10,
fetch_size => 2,
max_records => 7,
verbose => true
);
SELECT runtime,name,released FROM public.heap3;
/*
* clean up the mess
*/
DROP TABLE IF EXISTS public.t1, public.t2, public.t3, public.heap1, public.heap2, public.heap3;
DROP FOREIGN TABLE public.film, dbpedia_cities;
DROP SERVER dbpedia;
/* == Exceptions == */
CREATE TABLE public.t1_local(id serial, c1_null text, c2_null text);
CREATE TABLE public.t2_local(name text, foo text);
/*
ordinary table instead of foreign table in 'foreign_table'
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1_local',
target_table => 't2_local'
);
/*
foreign table instead of an ordinary table in 'target_table'
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1'
);
/*
empty target_table
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => ''
);
/*
empty foreign_table
*/
CALL
rdf_fdw_clone_table(
foreign_table => '',
target_table => 't1_local'
);
/*
negative fetch_size
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
fetch_size => -1
);
/*
negative begin_offset
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => -1
);
/*
invalid ordering_column
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't2_local',
orderby_column => 'foo'
);
/*
target table does not match any column of t1
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local'
);
/*
invalid sort_order
*/
CALL
rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
sort_order => 'foo'
);
/*
NULL foreign_table
*/
CALL rdf_fdw_clone_table(
foreign_table => NULL,
target_table => 't1_local');
/*
NULL target_table
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => NULL);
/*
NULL begin_offset
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => NULL);
/*
NULL fetch_size
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => NULL);
/*
NULL max_records
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => 8,
max_records => NULL);
/*
NULL sort_order
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => 8,
max_records => 103,
orderby_column => 'foo',
sort_order => NULL);
/*
NULL create_table
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => 8,
max_records => 103,
orderby_column => 'foo',
sort_order => 'DESC',
create_table => NULL);
/*
NULL verbose
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => 8,
max_records => 103,
orderby_column => 'foo',
sort_order => 'DESC',
create_table => true,
verbose => NULL);
/*
NULL commit_page
*/
CALL rdf_fdw_clone_table(
foreign_table => 't1',
target_table => 't1_local',
begin_offset => 42,
fetch_size => 8,
max_records => 103,
orderby_column => 'foo',
sort_order => 'DESC',
create_table => true,
verbose => false,
commit_page => NULL);
DROP TABLE IF EXISTS t1_local, t2_local;