@@ -57,13 +57,17 @@ CREATE OR REPLACE FUNCTION _timescaledb_internal.create_chunk_constraint(
57
57
chunk_id INTEGER ,
58
58
constraint_oid OID
59
59
)
60
- RETURNS VOID LANGUAGE PLPGSQL AS
60
+ RETURNS OID LANGUAGE PLPGSQL AS
61
61
$BODY$
62
62
DECLARE
63
63
chunk_constraint_row _timescaledb_catalog .chunk_constraint ;
64
+ chunk_row _timescaledb_catalog .chunk ;
64
65
constraint_row pg_constraint;
66
+ hypertable_index_class_row pg_class;
67
+ chunk_index_class_row pg_class;
65
68
constraint_name TEXT ;
66
69
hypertable_constraint_name TEXT = NULL ;
70
+ chunk_constraint_oid OID ;
67
71
BEGIN
68
72
SELECT * INTO STRICT constraint_row FROM pg_constraint WHERE OID = constraint_oid;
69
73
hypertable_constraint_name := constraint_row .conname ;
72
76
INSERT INTO _timescaledb_catalog .chunk_constraint (chunk_id, constraint_name, dimension_slice_id, hypertable_constraint_name)
73
77
VALUES (chunk_id, constraint_name, NULL , hypertable_constraint_name) RETURNING * INTO STRICT chunk_constraint_row;
74
78
79
+ -- create actual constraint
75
80
PERFORM _timescaledb_internal .chunk_constraint_add_table_constraint (chunk_constraint_row);
81
+
82
+ SELECT * INTO STRICT chunk_row FROM _timescaledb_catalog .chunk chunk WHERE chunk .id = chunk_id;
83
+
84
+ SELECT oid INTO STRICT chunk_constraint_oid
85
+ FROM pg_constraint con
86
+ WHERE con .conrelid = format(' %I.%I' , chunk_row .schema_name , chunk_row .table_name )::regclass
87
+ AND con .conname = constraint_name;
88
+
89
+ RETURN chunk_constraint_oid;
76
90
END
77
91
$BODY$;
78
92
@@ -88,6 +102,7 @@ $BODY$
88
102
DECLARE
89
103
chunk_row _timescaledb_catalog .chunk ;
90
104
chunk_constraint_row _timescaledb_catalog .chunk_constraint ;
105
+ constraint_row pg_constraint;
91
106
BEGIN
92
107
SELECT * INTO STRICT chunk_row FROM _timescaledb_catalog .chunk c WHERE c .id = chunk_id;
93
108
@@ -96,6 +111,11 @@ BEGIN
96
111
AND cc .chunk_id = drop_chunk_constraint .chunk_id
97
112
RETURNING * INTO STRICT chunk_constraint_row;
98
113
114
+ SELECT * INTO STRICT constraint_row
115
+ FROM pg_constraint con
116
+ WHERE con .conrelid = format(' %I.%I' , chunk_row .schema_name , chunk_row .table_name )::regclass
117
+ AND con .conname = constraint_name;
118
+
99
119
IF alter_table THEN
100
120
EXECUTE format(
101
121
$$ ALTER TABLE %I.%I DROP CONSTRAINT %I $$,
@@ -106,71 +126,6 @@ BEGIN
106
126
END
107
127
$BODY$;
108
128
109
- -- do I need to add a hypertable constraint to the chunks?;
110
- CREATE OR REPLACE FUNCTION _timescaledb_internal .need_chunk_constraint(
111
- constraint_oid OID
112
- )
113
- RETURNS BOOLEAN LANGUAGE PLPGSQL VOLATILE AS
114
- $BODY$
115
- DECLARE
116
- constraint_row record;
117
- BEGIN
118
- SELECT * INTO STRICT constraint_row FROM pg_constraint WHERE OID = constraint_oid;
119
-
120
- IF constraint_row .contype IN (' c' ) THEN
121
- -- check and not null constraints handled by regular inheritance (from docs):
122
- -- All check constraints and not-null constraints on a parent table are automatically inherited by its children,
123
- -- unless explicitly specified otherwise with NO INHERIT clauses. Other types of constraints
124
- -- (unique, primary key, and foreign key constraints) are not inherited."
125
-
126
- IF constraint_row .connoinherit THEN
127
- RAISE ' NO INHERIT option not supported on hypertables: %' , constraint_row .conname
128
- USING ERRCODE = ' IO101' ;
129
- END IF;
130
-
131
- RETURN FALSE;
132
- END IF;
133
- RETURN TRUE;
134
- END
135
- $BODY$;
136
-
137
- -- Creates a constraint on all chunks for a hypertable.
138
- CREATE OR REPLACE FUNCTION _timescaledb_internal .add_constraint(
139
- hypertable_id INTEGER ,
140
- constraint_oid OID
141
- )
142
- RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
143
- $BODY$
144
- DECLARE
145
- constraint_row pg_constraint;
146
- hypertable_row _timescaledb_catalog .hypertable ;
147
- BEGIN
148
- IF _timescaledb_internal .need_chunk_constraint (constraint_oid) THEN
149
- SELECT * INTO STRICT constraint_row FROM pg_constraint WHERE OID = constraint_oid;
150
-
151
- PERFORM _timescaledb_internal .create_chunk_constraint (c .id , constraint_oid)
152
- FROM _timescaledb_catalog .chunk c
153
- WHERE c .hypertable_id = add_constraint .hypertable_id ;
154
- END IF;
155
- END
156
- $BODY$;
157
-
158
- CREATE OR REPLACE FUNCTION _timescaledb_internal .add_constraint_by_name(
159
- hypertable_id INTEGER ,
160
- constraint_name name
161
- )
162
- RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
163
- $BODY$
164
- DECLARE
165
- constraint_oid OID ;
166
- BEGIN
167
- SELECT oid INTO STRICT constraint_oid FROM pg_constraint WHERE conname = constraint_name
168
- AND conrelid = _timescaledb_internal .main_table_from_hypertable (hypertable_id);
169
-
170
- PERFORM _timescaledb_internal .add_constraint (hypertable_id, constraint_oid);
171
- END
172
- $BODY$;
173
-
174
129
-- Drops constraint on all chunks for a hypertable.
175
130
CREATE OR REPLACE FUNCTION _timescaledb_internal .drop_constraint(
176
131
hypertable_id INTEGER ,
0 commit comments