1414DECLARE
1515 v_valueTEXT ;
1616 iINTEGER ;
17+ sqlTEXT ;
1718BEGIN
1819 p_relation := @extschema@.validate_relname(p_relation);
1920
2829 EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
2930 EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
3031
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+
3148INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
3249VALUES (p_relation, p_attribute,2 );
3350
8198 EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
8299 EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
83100
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+
84107INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
85108VALUES (p_relation, p_attribute,2 );
86109
@@ -103,6 +126,11 @@ BEGIN
103126 PERFORM @extschema@.partition_data(p_relation);
104127
105128 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;
106134END
107135$$ LANGUAGE plpgsql;
108136
@@ -138,6 +166,12 @@ BEGIN
138166 EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
139167 EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
140168
169+ /* check boundaries*/
170+ PERFORM @extschema@.check_boundaries(p_relation
171+ , p_attribute
172+ , p_start_value
173+ , p_end_value);
174+
141175INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
142176VALUES (p_relation, p_attribute,2 );
143177
@@ -157,7 +191,7 @@ BEGIN
157191 PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
158192
159193/* Copy data*/
160- PERFORM @extschema@.partition_data(p_relation);
194+ -- PERFORM @extschema@.partition_data(p_relation);
161195
162196 RETURN i;
163197END
@@ -191,6 +225,12 @@ BEGIN
191225 EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
192226 EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
193227
228+ /* check boundaries*/
229+ PERFORM @extschema@.check_boundaries(p_relation
230+ , p_attribute
231+ , p_start_value
232+ , p_end_value);
233+
194234INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
195235VALUES (p_relation, p_attribute,2 );
196236
@@ -209,12 +249,54 @@ BEGIN
209249 PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
210250
211251/* Copy data*/
212- PERFORM @extschema@.partition_data(p_relation);
252+ -- PERFORM @extschema@.partition_data(p_relation);
213253
214254 RETURN i;
215255END
216256$$ LANGUAGE plpgsql;
217257
258+ /*
259+ *
260+ */
261+ CREATEOR REPLACE FUNCTION @extschema@.check_boundaries(
262+ p_relnameTEXT
263+ , p_attributeTEXT
264+ , p_start_value ANYELEMENT
265+ , p_end_value ANYELEMENT)
266+ RETURNS VOIDAS
267+ $$
268+ DECLARE
269+ v_min p_start_value%TYPE;
270+ v_max p_start_value%TYPE;
271+ v_countINTEGER ;
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 ISNULL OR v_max ISNULL ) 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+
218300/*
219301 * Formats range condition. Utility function.
220302*/
@@ -271,7 +353,12 @@ BEGIN
271353
272354/* get next value from sequence*/
273355 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'));
275362
276363/* Skip existing partitions*/
277364 IF EXISTS (SELECT * FROM pg_tablesWHERE tablename= v_child_relname) THEN
@@ -775,7 +862,7 @@ DECLARE
775862 v_partTEXT ;
776863BEGIN
777864 IF p_new_value>= p_max THEN
778- WHILE (p_max+ i* (p_max- p_min))<= p_new_valueOR i> 1000
865+ WHILE (p_max+ i* (p_max- p_min))<= p_new_valueAND i< 1000
779866 LOOP
780867 v_part := @extschema@.create_single_range_partition(
781868 @extschema@.get_schema_qualified_name(p_relid::regclass,' .' )
@@ -786,7 +873,7 @@ BEGIN
786873 END LOOP;
787874 ELSIF p_new_value<= p_min THEN
788875
789- WHILE (p_min- i* (p_max- p_min))>= p_new_valueOR i> 1000
876+ WHILE (p_min- i* (p_max- p_min))>= p_new_valueAND i< 1000
790877 LOOP
791878 v_part := @extschema@.create_single_range_partition(
792879 @extschema@.get_schema_qualified_name(p_relid::regclass,' .' )