The files create_test_tables_temporal.sql
and create_test_tables_tpoint.sql
provide usage examples for the functions generating random values listed above. For example, the first file defines the following function.
CREATE OR REPLACE FUNCTION create_test_tables_temporal(size integer DEFAULT 100) RETURNS text AS $$ DECLARE perc integer; BEGIN perc := size * 0.01; IF perc < 1 THEN perc := 1; END IF; -- ... Table generation ... RETURN 'The End'; END; $$ LANGUAGE 'plpgsql';
The function has a size
parameter that defines the number of rows in the tables. If not provided, it creates by default tables of 100 rows. The function defines a variable perc
that computes the 1% of the size of the tables. This parameter is used, for example, for generating tables having 1% of null values. We illustrate next some of the commands generating tables.
The creation of a table tbl_float
containing random float
values in the range [0,100] with 1% of null values is given next.
CREATE TABLE tbl_float AS /* Add perc NULL values */ SELECT k, NULL AS f FROM generate_series(1, perc) AS k UNION SELECT k, random_float(0, 100) FROM generate_series(perc+1, size) AS k;
The creation of a table tbl_tbox
containing random tbox
values where the bounds for values are in the range [0,100] and the bounds for timestamps are in the range [2001-01-01, 2001-12-31] is given next.
CREATE TABLE tbl_tbox AS /* Add perc NULL values */ SELECT k, NULL AS b FROM generate_series(1, perc) AS k UNION SELECT k, random_tbox(0, 100, '2001-01-01', '2001-12-31', 10, 10) FROM generate_series(perc+1, size) AS k;
The creation of a table tbl_floatspan
containing random floatspan
values where the bounds for values are in the range [0,100] and the maximum difference between the lower and the upper bounds is 10 is given next.
CREATE TABLE tbl_floatspan AS /* Add perc NULL values */ SELECT k, NULL AS f FROM generate_series(1, perc) AS k UNION SELECT k, random_floatspan(0, 100, 10) FROM generate_series(perc+1, size) AS k;
The creation of a table tbl_tstzset
containing random tstzset
values having between 5 and 10 timestamps where the timestamps are in the range [2001-01-01, 2001-12-31] and the maximum interval between consecutive timestamps is 10 minutes is given next.
CREATE TABLE tbl_tstzset AS /* Add perc NULL values */ SELECT k, NULL AS ts FROM generate_series(1, perc) AS k UNION SELECT k, random_tstzset('2001-01-01', '2001-12-31', 10, 5, 10) FROM generate_series(perc+1, size) AS k;
The creation of a table tbl_tstzspan
containing random tstzspan
values where the timestamps are in the range [2001-01-01, 2001-12-31] and the maximum difference between the lower and the upper bounds is 10 minutes is given next.
CREATE TABLE tbl_tstzspan AS /* Add perc NULL values */ SELECT k, NULL AS p FROM generate_series(1, perc) AS k UNION SELECT k, random_tstzspan('2001-01-01', '2001-12-31', 10) FROM generate_series(perc+1, size) AS k;
The creation of a table tbl_geom_point
containing random geometry
2D point values, where the x and y coordinates are in the range [0, 100] and in SRID 3812 is given next.
CREATE TABLE tbl_geom_point AS SELECT 1 AS k, geometry 'SRID=3812;point empty' AS g UNION SELECT k, random_geom_point(0, 100, 0, 100, 3812) FROM generate_series(2, size) k;
Notice that the table contains an empty point value. If the SRID is not given it is set by default to 0.
The creation of a table tbl_geog_point3D
containing random geography
3D point values, where the x, y, and z coordinates are, respectively, in the ranges [-10, 32], [35, 72], and [0, 1000] and in SRID 7844 is given next.
CREATE TABLE tbl_geog_point3D AS SELECT 1 AS k, geography 'SRID=7844;pointZ empty' AS g UNION SELECT k, random_geog_point3D(-10, 32, 35, 72, 0, 1000, 7844) FROM generate_series(2, size) k;
Notice that latitude and longitude values are chosen to approximately cover continental Europe. If the SRID is not given it is set by default to 4326.
The creation of a table tbl_geom_linestring
containing random geometry
2D linestring values having between 5 and 10 vertices, where the x and y coordinates are in the range [0, 100] and in SRID 3812 and the maximum difference between consecutive coordinate values is 10 units in the underlying SRID is given next.
CREATE TABLE tbl_geom_linestring AS SELECT 1 AS k, geometry 'linestring empty' AS g UNION SELECT k, random_geom_linestring(0, 100, 0, 100, 10, 5, 10, 3812) FROM generate_series(2, size) k;
The creation of a table tbl_geom_linestring
containing random geometry
2D linestring values having between 5 and 10 vertices, where the x and y coordinates are in the range [0, 100] and the maximum difference between consecutive coordinate values is 10 units in the underlying SRID is given next.
CREATE TABLE tbl_geom_linestring AS SELECT 1 AS k, geometry 'linestring empty' AS g UNION SELECT k, random_geom_linestring(0, 100, 0, 100, 10, 5, 10) FROM generate_series(2, size) k;
The creation of a table tbl_geom_polygon3D
containing random geometry
3D polygon values without holes, having between 5 and 10 vertices, where the x, y, and z coordinates are in the range [0, 100] and the maximum difference between consecutive coordinate values is 10 units in the underlying SRID is given next.
CREATE TABLE tbl_geom_polygon3D AS SELECT 1 AS k, geometry 'polygon Z empty' AS g UNION SELECT k, random_geom_polygon3D(0, 100, 0, 100, 0, 100, 10, 5, 10) FROM generate_series(2, size) k;
The creation of a table tbl_geom_multipoint
containing random geometry
2D multipoint values having between 5 and 10 points, where the x and y coordinates are in the range [0, 100] and the maximum difference between consecutive coordinate values is 10 units in the underlying SRID is given next.
CREATE TABLE tbl_geom_multipoint AS SELECT 1 AS k, geometry 'multipoint empty' AS g UNION SELECT k, random_geom_multipoint(0, 100, 0, 100, 10, 5, 10) FROM generate_series(2, size) k;
The creation of a table tbl_geog_multilinestring
containing random geography
2D multilinestring values having between 5 and 10 linestrings, each one having between 5 and 10 vertices, where the x and y coordinates are, respectively, in the ranges [-10, 32] and [35, 72], and the maximum difference between consecutive coordinate values is 10 is given next.
CREATE TABLE tbl_geog_multilinestring AS SELECT 1 AS k, geography 'multilinestring empty' AS g UNION SELECT k, random_geog_multilinestring(-10, 32, 35, 72, 10, 5, 10, 5, 10) FROM generate_series(2, size) k;
The creation of a table tbl_geometry3D
containing random geometry
3D values of various types is given next. This function requires that the tables for the various geometry types have been created previously.
CREATE TABLE tbl_geometry3D ( k serial PRIMARY KEY, g geometry); INSERT INTO tbl_geometry3D(g) (SELECT g FROM tbl_geom_point3D ORDER BY k LIMIT (size * 0.1)) UNION ALL (SELECT g FROM tbl_geom_linestring3D ORDER BY k LIMIT (size * 0.1)) UNION ALL (SELECT g FROM tbl_geom_polygon3D ORDER BY k LIMIT (size * 0.2)) UNION ALL (SELECT g FROM tbl_geom_multipoint3D ORDER BY k LIMIT (size * 0.2)) UNION ALL (SELECT g FROM tbl_geom_multilinestring3D ORDER BY k LIMIT (size * 0.2)) UNION ALL (SELECT g FROM tbl_geom_multipolygon3D ORDER BY k LIMIT (size * 0.2));
The creation of a table tbl_tbool_inst
containing random tbool
values of instant subtype where the timestamps are in the range [2001-01-01, 2001-12-31] is given next.
CREATE TABLE tbl_tbool_inst AS /* Add perc NULL values */ SELECT k, NULL AS inst FROM generate_series(1, perc) AS k UNION SELECT k, random_tbool_inst('2001-01-01', '2001-12-31') FROM generate_series(perc+1, size) k; /* Add perc duplicates */ UPDATE tbl_tbool_inst t1 SET inst = (SELECT inst FROM tbl_tbool_inst t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc rows with the same timestamp */ UPDATE tbl_tbool_inst t1 SET inst = (SELECT tboolinst(random_bool(), getTimestamp(inst)) FROM tbl_tbool_inst t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i);
As can be seen above, the table has a percentage of null values, of duplicates, and of rows with the same timestamp.
The creation of a table tbl_tint_discseq
containing random tint
values of sequence subtype and discrete interpolation having between 5 and 10 timestamps where the integer values are in the range [0, 100], the timestamps are in the range [2001-01-01, 2001-12-31], the maximum difference between two consecutive values is 10, and the maximum interval between two consecutive instants is 10 minutes is given next.
CREATE TABLE tbl_tint_discseq AS /* Add perc NULL values */ SELECT k, NULL AS ti FROM generate_series(1, perc) AS k UNION SELECT k, random_tint_discseq(0, 100, '2001-01-01', '2001-12-31', 10, 10, 5, 10) AS ti FROM generate_series(perc+1, size) k; /* Add perc duplicates */ UPDATE tbl_tint_discseq t1 SET ti = (SELECT ti FROM tbl_tint_discseq t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc rows with the same timestamp */ UPDATE tbl_tint_discseq t1 SET ti = (SELECT ti + random_int(1, 2) FROM tbl_tint_discseq t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i); /* Add perc rows that meet */ UPDATE tbl_tint_discseq t1 SET ti = (SELECT shift(ti, endTimestamp(ti)-startTimestamp(ti)) FROM tbl_tint_discseq t2 WHERE t2.k = t1.k+perc) WHERE t1.k in (SELECT i FROM generate_series(1 + 6*perc, 7*perc) i); /* Add perc rows that overlap */ UPDATE tbl_tint_discseq t1 SET ti = (SELECT shift(ti, date_trunc('minute',(endTimestamp(ti)-startTimestamp(ti))/2)) FROM tbl_tint_discseq t2 WHERE t2.k = t1.k+2) WHERE t1.k in (SELECT i FROM generate_series(1 + 8*perc, 9*perc) i);
As can be seen above, the table has a percentage of null values, of duplicates, of rows with the same timestamp, of rows that meet, and of rows that overlap.
The creation of a table tbl_tfloat_seq
containing random tfloat
values of sequence subtype having between 5 and 10 timestamps where the float
values are in the range [0, 100], the timestamps are in the range [2001-01-01, 2001-12-31], the maximum difference between two consecutive values is 10, and the maximum interval between two consecutive instants is 10 minutes is given next.
CREATE TABLE tbl_tfloat_seq AS /* Add perc NULL values */ SELECT k, NULL AS seq FROM generate_series(1, perc) AS k UNION SELECT k, random_tfloat_seq(0, 100, '2001-01-01', '2001-12-31', 10, 10, 5, 10) AS seq FROM generate_series(perc+1, size) k; /* Add perc duplicates */ UPDATE tbl_tfloat_seq t1 SET seq = (SELECT seq FROM tbl_tfloat_seq t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc tuples with the same timestamp */ UPDATE tbl_tfloat_seq t1 SET seq = (SELECT seq + random_int(1, 2) FROM tbl_tfloat_seq t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i); /* Add perc tuples that meet */ UPDATE tbl_tfloat_seq t1 SET seq = (SELECT shift(seq, timespan(seq)) FROM tbl_tfloat_seq t2 WHERE t2.k = t1.k+perc) WHERE t1.k in (SELECT i FROM generate_series(1 + 6*perc, 7*perc) i); /* Add perc tuples that overlap */ UPDATE tbl_tfloat_seq t1 SET seq = (SELECT shift(seq, date_trunc('minute',timespan(seq)/2)) FROM tbl_tfloat_seq t2 WHERE t2.k = t1.k+perc) WHERE t1.k in (SELECT i FROM generate_series(1 + 8*perc, 9*perc) i);
The creation of a table tbl_ttext_seqset
containing random ttext
values of sequence set subtype having between 5 and 10 sequences, each one having between 5 and 10 timestamps, where the text values have at most 10 characters, the timestamps are in the range [2001-01-01, 2001-12-31], and the maximum interval between two consecutive instants is 10 minutes is given next.
CREATE TABLE tbl_ttext_seqset AS /* Add perc NULL values */ SELECT k, NULL AS ts FROM generate_series(1, perc) AS k UNION SELECT k, random_ttext_seqset('2001-01-01', '2001-12-31', 10, 10, 5, 10, 5, 10) AS ts FROM generate_series(perc+1, size) AS k; /* Add perc duplicates */ UPDATE tbl_ttext_seqset t1 SET ts = (SELECT ts FROM tbl_ttext_seqset t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc tuples with the same timestamp */ UPDATE tbl_ttext_seqset t1 SET ts = (SELECT ts || text 'A' FROM tbl_ttext_seqset t2 WHERE t2.k = t1.k+perc) WHERE k in (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i); /* Add perc tuples that meet */ UPDATE tbl_ttext_seqset t1 SET ts = (SELECT shift(ts, timespan(ts)) FROM tbl_ttext_seqset t2 WHERE t2.k = t1.k+perc) WHERE t1.k in (SELECT i FROM generate_series(1 + 6*perc, 7*perc) i); /* Add perc tuples that overlap */ UPDATE tbl_ttext_seqset t1 SET ts = (SELECT shift(ts, date_trunc('minute', timespan(ts)/2)) FROM tbl_ttext_seqset t2 WHERE t2.k = t1.k+perc) WHERE t1.k in (SELECT i FROM generate_series(1 + 8*perc, 9*perc) i);
The creation of a table tbl_tgeompoint_discseq
containing random tgeompoint
2D values of sequence subtype and discrete interpolation having between 5 and 10 instants, where the x and y coordinates are in the range [0, 100] and in SRID 3812, the timestamps are in the range [2001-01-01, 2001-12-31], the maximum difference between successive coordinates is at most 10 units in the underlying SRID, and the maximum interval between two consecutive instants is 10 minutes is given next.
CREATE TABLE tbl_tgeompoint_discseq AS SELECT k, random_tgeompoint_discseq(0, 100, 0, 100, '2001-01-01', '2001-12-31', 10, 10, 5, 10, 3812) AS ti FROM generate_series(1, size) k; /* Add perc duplicates */ UPDATE tbl_tgeompoint_discseq t1 SET ti = (SELECT ti FROM tbl_tgeompoint_discseq t2 WHERE t2.k = t1.k+perc) WHERE k IN (SELECT i FROM generate_series(1, perc) i); /* Add perc tuples with the same timestamp */ UPDATE tbl_tgeompoint_discseq t1 SET ti = (SELECT round(ti,6) FROM tbl_tgeompoint_discseq t2 WHERE t2.k = t1.k+perc) WHERE k IN (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc tuples that meet */ UPDATE tbl_tgeompoint_discseq t1 SET ti = (SELECT shift(ti, endTimestamp(ti)-startTimestamp(ti)) FROM tbl_tgeompoint_discseq t2 WHERE t2.k = t1.k+perc) WHERE t1.k IN (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i); /* Add perc tuples that overlap */ UPDATE tbl_tgeompoint_discseq t1 SET ti = (SELECT shift(ti, date_trunc('minute',(endTimestamp(ti)-startTimestamp(ti))/2)) FROM tbl_tgeompoint_discseq t2 WHERE t2.k = t1.k+2) WHERE t1.k IN (SELECT i FROM generate_series(1 + 6*perc, 7*perc) i);
Finally, the creation of a table tbl_tgeompoint3D_seqset
containing random tgeompoint
3D values of sequence set subtype having between 5 and 10 sequences, each one having between 5 and 10 timestamps, where the x, y, and z coordinates are in the range [0, 100] and in SRID 3812, the timestamps are in the range [2001-01-01, 2001-12-31], the maximum difference between successive coordinates is at most 10 units in the underlying SRID, and the maximum interval between two consecutive instants is 10 minutes is given next.
DROP TABLE IF EXISTS tbl_tgeompoint3D_seqset; CREATE TABLE tbl_tgeompoint3D_seqset AS SELECT k, random_tgeompoint3D_seqset(0, 100, 0, 100, 0, 100, '2001-01-01', '2001-12-31', 10, 10, 5, 10, 5, 10, 3812) AS ts FROM generate_series(1, size) AS k; /* Add perc duplicates */ UPDATE tbl_tgeompoint3D_seqset t1 SET ts = (SELECT ts FROM tbl_tgeompoint3D_seqset t2 WHERE t2.k = t1.k+perc) WHERE k IN (SELECT i FROM generate_series(1, perc) i); /* Add perc tuples with the same timestamp */ UPDATE tbl_tgeompoint3D_seqset t1 SET ts = (SELECT round(ts,3) FROM tbl_tgeompoint3D_seqset t2 WHERE t2.k = t1.k+perc) WHERE k IN (SELECT i FROM generate_series(1 + 2*perc, 3*perc) i); /* Add perc tuples that meet */ UPDATE tbl_tgeompoint3D_seqset t1 SET ts = (SELECT shift(ts, timespan(ts)) FROM tbl_tgeompoint3D_seqset t2 WHERE t2.k = t1.k+perc) WHERE t1.k IN (SELECT i FROM generate_series(1 + 4*perc, 5*perc) i); /* Add perc tuples that overlap */ UPDATE tbl_tgeompoint3D_seqset t1 SET ts = (SELECT shift(ts, date_trunc('minute', timespan(ts)/2)) FROM tbl_tgeompoint3D_seqset t2 WHERE t2.k = t1.k+perc) WHERE t1.k IN (SELECT i FROM generate_series(1 + 6*perc, 7*perc) i);