14
14
DECLARE
15
15
v_value TEXT ;
16
16
i INTEGER ;
17
+ sql TEXT ;
17
18
BEGIN
18
19
p_relation := @extschema@.validate_relname(p_relation);
19
20
28
29
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
29
30
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
30
31
32
+ /* check boundaries */
33
+ sql := format(' SELECT @extschema@.check_boundaries(' ' %s' ' , ' ' %s' ' , ' ' %s' ' , ' ' %s' ' ::%s)'
34
+ , p_relation
35
+ , p_attribute
36
+ , p_start_value
37
+ , p_start_value + p_interval* p_count
38
+ , pg_typeof(p_start_value));
39
+ RAISE NOTICE ' sql: %' , sql;
40
+
41
+ EXECUTE format(' SELECT @extschema@.check_boundaries(' ' %s' ' , ' ' %s' ' , ' ' %s' ' , ' ' %s' ' ::%s)'
42
+ , p_relation
43
+ , p_attribute
44
+ , p_start_value
45
+ , p_start_value + p_interval* p_count
46
+ , pg_typeof(p_start_value));
47
+
31
48
INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
32
49
VALUES (p_relation, p_attribute, 2 );
33
50
81
98
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
82
99
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
83
100
101
+ /* check boundaries */
102
+ PERFORM @extschema@.check_boundaries(p_relation
103
+ , p_attribute
104
+ , p_start_value
105
+ , p_start_value + p_interval* p_count);
106
+
84
107
INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
85
108
VALUES (p_relation, p_attribute, 2 );
86
109
@@ -103,6 +126,11 @@ BEGIN
103
126
PERFORM @extschema@.partition_data(p_relation);
104
127
105
128
RETURN p_count;
129
+
130
+ EXCEPTION WHEN others THEN
131
+ EXECUTE format(' DROP TABLE %s CASCADE' , p_relation);
132
+ PERFORM on_remove_partitions(p_relation::regclass::integer );
133
+ RAISE EXCEPTION ' % %' , SQLERRM, SQLSTATE;
106
134
END
107
135
$$ LANGUAGE plpgsql;
108
136
@@ -138,6 +166,12 @@ BEGIN
138
166
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
139
167
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
140
168
169
+ /* check boundaries */
170
+ PERFORM @extschema@.check_boundaries(p_relation
171
+ , p_attribute
172
+ , p_start_value
173
+ , p_end_value);
174
+
141
175
INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
142
176
VALUES (p_relation, p_attribute, 2 );
143
177
@@ -157,7 +191,7 @@ BEGIN
157
191
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
158
192
159
193
/* Copy data */
160
- PERFORM @extschema@.partition_data(p_relation);
194
+ -- PERFORM @extschema@.partition_data(p_relation);
161
195
162
196
RETURN i;
163
197
END
@@ -191,6 +225,12 @@ BEGIN
191
225
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
192
226
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
193
227
228
+ /* check boundaries */
229
+ PERFORM @extschema@.check_boundaries(p_relation
230
+ , p_attribute
231
+ , p_start_value
232
+ , p_end_value);
233
+
194
234
INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
195
235
VALUES (p_relation, p_attribute, 2 );
196
236
@@ -209,12 +249,54 @@ BEGIN
209
249
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
210
250
211
251
/* Copy data */
212
- PERFORM @extschema@.partition_data(p_relation);
252
+ -- PERFORM @extschema@.partition_data(p_relation);
213
253
214
254
RETURN i;
215
255
END
216
256
$$ LANGUAGE plpgsql;
217
257
258
+ /*
259
+ *
260
+ */
261
+ CREATE OR REPLACE FUNCTION @extschema@.check_boundaries(
262
+ p_relname TEXT
263
+ , p_attribute TEXT
264
+ , p_start_value ANYELEMENT
265
+ , p_end_value ANYELEMENT)
266
+ RETURNS VOID AS
267
+ $$
268
+ DECLARE
269
+ v_min p_start_value%TYPE;
270
+ v_max p_start_value%TYPE;
271
+ v_count INTEGER ;
272
+ BEGIN
273
+ RAISE NOTICE ' check_boundaries(%)' , p_relname;
274
+ /* Get min and max values */
275
+ EXECUTE format(' SELECT count(*), min(%s), max(%s) FROM %s WHERE NOT %s IS NULL' ,
276
+ p_attribute, p_attribute, p_relname, p_attribute)
277
+ INTO v_count, v_min, v_max;
278
+
279
+ RAISE NOTICE ' >>> MIN, MAX <<< %, %, %' , v_count, v_min, v_max;
280
+
281
+ /* check if column has NULL values */
282
+ IF v_count > 0 AND (v_min IS NULL OR v_max IS NULL ) THEN
283
+ RAISE EXCEPTION ' ' ' %' ' column has NULL values' , p_attribute;
284
+ END IF;
285
+
286
+ /* check lower boundary */
287
+ IF p_start_value < v_min THEN
288
+ RAISE EXCEPTION ' Start value is less than minimum value of ' ' %' ' '
289
+ , p_attribute;
290
+ END IF;
291
+
292
+ /* check upper boundary */
293
+ IF p_end_value >= v_max THEN
294
+ RAISE EXCEPTION ' End value is greater than maximum value of ' ' %' ' '
295
+ , p_attribute;
296
+ END IF;
297
+ END
298
+ $$ LANGUAGE plpgsql;
299
+
218
300
/*
219
301
* Formats range condition. Utility function.
220
302
*/
@@ -271,7 +353,12 @@ BEGIN
271
353
272
354
/* get next value from sequence */
273
355
v_part_num := nextval(format(' %s_seq' , p_parent_relname));
274
- v_child_relname := format(' %s_%s' , p_parent_relname, v_part_num);
356
+ v_child_relname := format(' %s_%s'
357
+ , p_parent_relname
358
+ , v_part_num);
359
+ -- v_child_relname := format('%s_%s'
360
+ -- , p_parent_relname
361
+ -- , regexp_replace(p_start_value::text, '[ :-]*', '', 'g'));
275
362
276
363
/* Skip existing partitions */
277
364
IF EXISTS (SELECT * FROM pg_tables WHERE tablename = v_child_relname) THEN
@@ -775,7 +862,7 @@ DECLARE
775
862
v_part TEXT ;
776
863
BEGIN
777
864
IF p_new_value >= p_max THEN
778
- WHILE (p_max + i * (p_max - p_min)) <= p_new_value OR i > 1000
865
+ WHILE (p_max + i * (p_max - p_min)) <= p_new_value AND i < 1000
779
866
LOOP
780
867
v_part := @extschema@.create_single_range_partition(
781
868
@extschema@.get_schema_qualified_name(p_relid::regclass, ' .' )
@@ -786,7 +873,7 @@ BEGIN
786
873
END LOOP;
787
874
ELSIF p_new_value <= p_min THEN
788
875
789
- WHILE (p_min - i * (p_max - p_min)) >= p_new_value OR i > 1000
876
+ WHILE (p_min - i * (p_max - p_min)) >= p_new_value AND i < 1000
790
877
LOOP
791
878
v_part := @extschema@.create_single_range_partition(
792
879
@extschema@.get_schema_qualified_name(p_relid::regclass, ' .' )
0 commit comments