mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-18 11:45:11 +08:00
Merged in cleanup-insert (pull request #20)
This commit is contained in:
commit
1d50810ccb
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
extension/sql/tests/unit/testoutputs.tmp
|
@ -1,14 +1,9 @@
|
|||||||
-- Get a comma-separated list of fields in a hypertable.
|
-- This file contains functions that aid in inserting data into a hypertable.
|
||||||
CREATE OR REPLACE FUNCTION get_field_list(
|
|
||||||
hypertable_name NAME
|
|
||||||
)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT array_to_string(get_quoted_field_names(hypertable_name), ', ')
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
-- Creates a temporary table with the same structure as a given hypertable.
|
-- Creates a temporary table with the same structure as a given hypertable.
|
||||||
-- This can be used for bulk inserts.
|
-- This can be used for bulk inserts.
|
||||||
|
-- TODO(rrk) - This is currently only used by unit tests, rewrite unit tests so
|
||||||
|
-- we can remove it.
|
||||||
CREATE OR REPLACE FUNCTION create_temp_copy_table(
|
CREATE OR REPLACE FUNCTION create_temp_copy_table(
|
||||||
hypertable_name NAME,
|
hypertable_name NAME,
|
||||||
table_name TEXT
|
table_name TEXT
|
||||||
@ -38,8 +33,21 @@ BEGIN
|
|||||||
END
|
END
|
||||||
$BODY$;
|
$BODY$;
|
||||||
|
|
||||||
|
-- Get a comma-separated list of fields in a hypertable.
|
||||||
|
CREATE OR REPLACE FUNCTION _sysinternal.get_field_list(
|
||||||
|
hypertable_name NAME
|
||||||
|
)
|
||||||
|
RETURNS TEXT LANGUAGE SQL STABLE AS
|
||||||
|
$BODY$
|
||||||
|
SELECT array_to_string(get_quoted_field_names(hypertable_name), ', ')
|
||||||
|
$BODY$;
|
||||||
|
|
||||||
-- Gets the partition ID of a given epoch and data row.
|
-- Gets the partition ID of a given epoch and data row.
|
||||||
CREATE OR REPLACE FUNCTION get_partition_for_epoch_row(
|
--
|
||||||
|
-- epoch - The epoch whose partition ID we want
|
||||||
|
-- copy_record - Record/row from a table
|
||||||
|
-- copy_table_name - Name of the relation to cast the record to.
|
||||||
|
CREATE OR REPLACE FUNCTION _sysinternal.get_partition_for_epoch_row(
|
||||||
epoch partition_epoch,
|
epoch partition_epoch,
|
||||||
copy_record anyelement,
|
copy_record anyelement,
|
||||||
copy_table_name TEXT
|
copy_table_name TEXT
|
||||||
@ -66,8 +74,12 @@ BEGIN
|
|||||||
END
|
END
|
||||||
$BODY$;
|
$BODY$;
|
||||||
|
|
||||||
-- Gets the time value of a temp table row.
|
-- Gets the value of a field from a given row.
|
||||||
CREATE OR REPLACE FUNCTION get_time_from_copy_row(
|
--
|
||||||
|
-- field_name - Name of field/column to fetch
|
||||||
|
-- copy_record - Record/row from a table
|
||||||
|
-- copy_table_name - Name of the relation to cast the record to
|
||||||
|
CREATE OR REPLACE FUNCTION _sysinternal.get_field_from_record(
|
||||||
field_name NAME,
|
field_name NAME,
|
||||||
copy_record anyelement,
|
copy_record anyelement,
|
||||||
copy_table_name TEXT
|
copy_table_name TEXT
|
||||||
@ -87,7 +99,15 @@ BEGIN
|
|||||||
END
|
END
|
||||||
$BODY$;
|
$BODY$;
|
||||||
|
|
||||||
-- Inserts rows from a temporary table into correct hypertable child tables.
|
-- Inserts rows from a (temporary) table into correct hypertable child tables.
|
||||||
|
--
|
||||||
|
-- In typical use case, the copy_table_oid is the OID of a hypertable's main
|
||||||
|
-- table. This allows users to use normal SQL INSERT calls on the main table,
|
||||||
|
-- and a trigger that executes after the statement will call this function to
|
||||||
|
-- place the data appropriately.
|
||||||
|
--
|
||||||
|
-- hypertable_name - Name of the hypertable the data belongs to
|
||||||
|
-- copy_table_oid -- OID of the table to fetch rows from
|
||||||
CREATE OR REPLACE FUNCTION insert_data(
|
CREATE OR REPLACE FUNCTION insert_data(
|
||||||
hypertable_name NAME,
|
hypertable_name NAME,
|
||||||
copy_table_oid REGCLASS
|
copy_table_oid REGCLASS
|
||||||
@ -107,15 +127,15 @@ BEGIN
|
|||||||
time_point := 1;
|
time_point := 1;
|
||||||
EXECUTE format(
|
EXECUTE format(
|
||||||
$$
|
$$
|
||||||
SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'), h.time_field_name, p.id
|
SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'), h.time_field_name, p.id
|
||||||
FROM ONLY %1$s ct
|
FROM ONLY %1$s ct
|
||||||
LEFT JOIN hypertable h ON (h.NAME = %2$L)
|
LEFT JOIN hypertable h ON (h.NAME = %2$L)
|
||||||
LEFT JOIN partition_epoch pe ON (
|
LEFT JOIN partition_epoch pe ON (
|
||||||
pe.hypertable_name = %2$L AND
|
pe.hypertable_name = %2$L AND
|
||||||
(pe.start_time <= (SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'))::bigint OR pe.start_time IS NULL) AND
|
(pe.start_time <= (SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'))::bigint OR pe.start_time IS NULL) AND
|
||||||
(pe.end_time >= (SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'))::bigint OR pe.end_time IS NULL)
|
(pe.end_time >= (SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'))::bigint OR pe.end_time IS NULL)
|
||||||
)
|
)
|
||||||
LEFT JOIN get_partition_for_epoch_row(pe, ct, '%1$s') AS p ON(true)
|
LEFT JOIN _sysinternal.get_partition_for_epoch_row(pe, ct, '%1$s') AS p ON(true)
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
$$, copy_table_oid, hypertable_name)
|
$$, copy_table_oid, hypertable_name)
|
||||||
INTO STRICT time_point, time_field_name_point, partition_id;
|
INTO STRICT time_point, time_field_name_point, partition_id;
|
||||||
@ -178,21 +198,21 @@ BEGIN
|
|||||||
format('%I.%I', crn_record.schema_name, crn_record.table_name) :: REGCLASS,
|
format('%I.%I', crn_record.schema_name, crn_record.table_name) :: REGCLASS,
|
||||||
copy_table_oid, crn_record.start_time, crn_record.end_time,
|
copy_table_oid, crn_record.start_time, crn_record.end_time,
|
||||||
distinct_clauses,
|
distinct_clauses,
|
||||||
get_field_list(hypertable_name),
|
_sysinternal.get_field_list(hypertable_name),
|
||||||
time_field_name_point);
|
time_field_name_point);
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
EXECUTE format(
|
EXECUTE format(
|
||||||
$$
|
$$
|
||||||
SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'), h.time_field_name, p.id
|
SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'), h.time_field_name, p.id
|
||||||
FROM ONLY %1$s ct
|
FROM ONLY %1$s ct
|
||||||
LEFT JOIN hypertable h ON (h.NAME = %2$L)
|
LEFT JOIN hypertable h ON (h.NAME = %2$L)
|
||||||
LEFT JOIN partition_epoch pe ON (
|
LEFT JOIN partition_epoch pe ON (
|
||||||
pe.hypertable_name = %2$L AND
|
pe.hypertable_name = %2$L AND
|
||||||
(pe.start_time <= (SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'))::bigint OR pe.start_time IS NULL) AND
|
(pe.start_time <= (SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'))::bigint OR pe.start_time IS NULL) AND
|
||||||
(pe.end_time >= (SELECT get_time_from_copy_row(h.time_field_name, ct, '%1$s'))::bigint OR pe.end_time IS NULL)
|
(pe.end_time >= (SELECT _sysinternal.get_field_from_record(h.time_field_name, ct, '%1$s'))::bigint OR pe.end_time IS NULL)
|
||||||
)
|
)
|
||||||
LEFT JOIN get_partition_for_epoch_row(pe, ct, '%1$s') AS p ON(true)
|
LEFT JOIN _sysinternal.get_partition_for_epoch_row(pe, ct, '%1$s') AS p ON(true)
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
$$, copy_table_oid, hypertable_name)
|
$$, copy_table_oid, hypertable_name)
|
||||||
INTO time_point, time_field_name_point, partition_id;
|
INTO time_point, time_field_name_point, partition_id;
|
||||||
|
@ -66,21 +66,7 @@ SELECT set_is_distinct_flag('"public"."testNs"', 'device_id', TRUE);
|
|||||||
|
|
||||||
\c Test1
|
\c Test1
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT *
|
\COPY "testNs" FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
||||||
FROM create_temp_copy_table('testNs', 'copy_t');
|
|
||||||
create_temp_copy_table
|
|
||||||
------------------------
|
|
||||||
copy_t
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
\COPY copy_t FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
|
||||||
SELECT *
|
|
||||||
FROM insert_data('testNs', 'copy_t');
|
|
||||||
insert_data
|
|
||||||
-------------
|
|
||||||
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT close_chunk_end(c.id)
|
SELECT close_chunk_end(c.id)
|
||||||
FROM get_open_partition_for_key('testNs', 'dev1') part
|
FROM get_open_partition_for_key('testNs', 'dev1') part
|
||||||
|
@ -66,21 +66,7 @@ SELECT set_is_distinct_flag('"public"."testNs"', 'device_id', TRUE);
|
|||||||
|
|
||||||
\c Test1
|
\c Test1
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT *
|
\COPY "testNs" FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
||||||
FROM create_temp_copy_table('testNs', 'copy_t');
|
|
||||||
create_temp_copy_table
|
|
||||||
------------------------
|
|
||||||
copy_t
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
\COPY copy_t FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
|
||||||
SELECT *
|
|
||||||
FROM insert_data('testNs', 'copy_t');
|
|
||||||
insert_data
|
|
||||||
-------------
|
|
||||||
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT close_chunk_end(c.id)
|
SELECT close_chunk_end(c.id)
|
||||||
FROM get_open_partition_for_key('testNs', 'dev1') part
|
FROM get_open_partition_for_key('testNs', 'dev1') part
|
||||||
|
@ -32,11 +32,7 @@ SELECT set_is_distinct_flag('"public"."testNs"', 'device_id', TRUE);
|
|||||||
|
|
||||||
\c Test1
|
\c Test1
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT *
|
\COPY "testNs" FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
||||||
FROM create_temp_copy_table('testNs', 'copy_t');
|
|
||||||
\COPY copy_t FROM 'data/ds1_dev1_1.tsv' NULL AS '';
|
|
||||||
SELECT *
|
|
||||||
FROM insert_data('testNs', 'copy_t');
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
SELECT close_chunk_end(c.id)
|
SELECT close_chunk_end(c.id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user