Skip to content

Commit 834db2d

Browse files
committed
move HASH & RANGE function declarations from init.sql to their corresponding files, get_partition_range() -> +get_range_by_part_oid()
1 parent 476acbe commit 834db2d

File tree

6 files changed

+73
-72
lines changed

6 files changed

+73
-72
lines changed

hash.sql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,17 @@ BEGIN
176176
END LOOP;
177177
END
178178
$$ LANGUAGE plpgsql;
179+
180+
/*
181+
* Returns hash function OID for specified type
182+
*/
183+
CREATE OR REPLACE FUNCTION @extschema@.get_type_hash_func(OID)
184+
RETURNS OID AS 'pg_pathman', 'get_type_hash_func'
185+
LANGUAGE C STRICT;
186+
187+
/*
188+
* Calculates hash for integer value
189+
*/
190+
CREATE OR REPLACE FUNCTION @extschema@.get_hash(INTEGER, INTEGER)
191+
RETURNS INTEGER AS 'pg_pathman', 'get_hash'
192+
LANGUAGE C STRICT;

init.sql

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,6 @@ CREATE OR REPLACE FUNCTION @extschema@.is_date_type(cls REGTYPE)
312312
RETURNS BOOLEAN AS 'pg_pathman', 'is_date_type'
313313
LANGUAGE C STRICT;
314314

315-
/*
316-
* Checks if range overlaps with existing partitions.
317-
* Returns TRUE if overlaps and FALSE otherwise.
318-
*/
319-
CREATE OR REPLACE FUNCTION @extschema@.check_overlap(
320-
parent_relid OID, range_min ANYELEMENT, range_max ANYELEMENT)
321-
RETURNS BOOLEAN AS 'pg_pathman', 'check_overlap'
322-
LANGUAGE C STRICT;
323-
324315

325316
CREATE OR REPLACE FUNCTION @extschema@.on_create_partitions(relid OID)
326317
RETURNS VOID AS 'pg_pathman', 'on_partitions_created'
@@ -335,58 +326,6 @@ RETURNS VOID AS 'pg_pathman', 'on_partitions_removed'
335326
LANGUAGE C STRICT;
336327

337328

338-
CREATE OR REPLACE FUNCTION @extschema@.find_or_create_range_partition(relid OID, value ANYELEMENT)
339-
RETURNS OID AS 'pg_pathman', 'find_or_create_range_partition'
340-
LANGUAGE C STRICT;
341-
342-
343-
/*
344-
* Returns min and max values for specified RANGE partition.
345-
*/
346-
CREATE OR REPLACE FUNCTION @extschema@.get_partition_range(
347-
parent_relid OID, partition_relid OID, dummy ANYELEMENT)
348-
RETURNS ANYARRAY AS 'pg_pathman', 'get_partition_range'
349-
LANGUAGE C STRICT;
350-
351-
352-
/*
353-
* Returns N-th range (in form of array)
354-
*/
355-
CREATE OR REPLACE FUNCTION @extschema@.get_range_by_idx(
356-
parent_relid OID, idx INTEGER, dummy ANYELEMENT)
357-
RETURNS ANYARRAY AS 'pg_pathman', 'get_range_by_idx'
358-
LANGUAGE C STRICT;
359-
360-
/*
361-
* Returns min value of the first range for relation
362-
*/
363-
CREATE OR REPLACE FUNCTION @extschema@.get_min_range_value(
364-
parent_relid OID, dummy ANYELEMENT)
365-
RETURNS ANYELEMENT AS 'pg_pathman', 'get_min_range_value'
366-
LANGUAGE C STRICT;
367-
368-
/*
369-
* Returns max value of the last range for relation
370-
*/
371-
CREATE OR REPLACE FUNCTION @extschema@.get_max_range_value(
372-
parent_relid OID, dummy ANYELEMENT)
373-
RETURNS ANYELEMENT AS 'pg_pathman', 'get_max_range_value'
374-
LANGUAGE C STRICT;
375-
376-
/*
377-
* Returns hash function OID for specified type
378-
*/
379-
CREATE OR REPLACE FUNCTION @extschema@.get_type_hash_func(OID)
380-
RETURNS OID AS 'pg_pathman', 'get_type_hash_func'
381-
LANGUAGE C STRICT;
382-
383-
/*
384-
* Calculates hash for integer value
385-
*/
386-
CREATE OR REPLACE FUNCTION @extschema@.get_hash(INTEGER, INTEGER)
387-
RETURNS INTEGER AS 'pg_pathman', 'get_hash'
388-
LANGUAGE C STRICT;
389-
390329
/*
391330
* Checks if attribute is nullable
392331
*/

range.sql

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ BEGIN
465465
END IF;
466466

467467
/* Get partition values range */
468-
p_range := @extschema@.get_partition_range(v_parent_relid, v_child_relid, 0);
468+
p_range := @extschema@.get_range_by_part_oid(v_parent_relid, v_child_relid, 0);
469469
IF p_range IS NULL THEN
470470
RAISE EXCEPTION 'Could not find specified partition';
471471
END IF;
@@ -602,8 +602,8 @@ BEGIN
602602
* first and second elements of array are MIN and MAX of partition1
603603
* third and forth elements are MIN and MAX of partition2
604604
*/
605-
p_range := @extschema@.get_partition_range(p_parent_relid, p_part1::oid, 0) ||
606-
@extschema@.get_partition_range(p_parent_relid, p_part2::oid, 0);
605+
p_range := @extschema@.get_range_by_part_oid(p_parent_relid, p_part1, 0) ||
606+
@extschema@.get_range_by_part_oid(p_parent_relid, p_part2, 0);
607607

608608
/* Check if ranges are adjacent */
609609
IF p_range[1] != p_range[4] AND p_range[2] != p_range[3] THEN
@@ -1080,6 +1080,7 @@ BEGIN
10801080
END
10811081
$$ LANGUAGE plpgsql;
10821082

1083+
10831084
/*
10841085
* Construct CHECK constraint condition for a range partition.
10851086
*/
@@ -1089,3 +1090,52 @@ CREATE OR REPLACE FUNCTION @extschema@.get_range_condition(
10891090
p_end_value ANYELEMENT)
10901091
RETURNS TEXT AS 'pg_pathman', 'get_range_condition'
10911092
LANGUAGE C STRICT;
1093+
1094+
/*
1095+
* Returns N-th range (as an array of two elements).
1096+
*/
1097+
CREATE OR REPLACE FUNCTION @extschema@.get_range_by_idx(
1098+
parent_relid OID, idx INTEGER, dummy ANYELEMENT)
1099+
RETURNS ANYARRAY AS 'pg_pathman', 'get_range_by_idx'
1100+
LANGUAGE C STRICT;
1101+
1102+
/*
1103+
* Returns min and max values for specified RANGE partition.
1104+
*/
1105+
CREATE OR REPLACE FUNCTION @extschema@.get_range_by_part_oid(
1106+
parent_relid OID, partition_relid OID, dummy ANYELEMENT)
1107+
RETURNS ANYARRAY AS 'pg_pathman', 'get_range_by_part_oid'
1108+
LANGUAGE C STRICT;
1109+
1110+
/*
1111+
* Returns min value of the first partition's RangeEntry.
1112+
*/
1113+
CREATE OR REPLACE FUNCTION @extschema@.get_min_range_value(
1114+
parent_relid OID, dummy ANYELEMENT)
1115+
RETURNS ANYELEMENT AS 'pg_pathman', 'get_min_range_value'
1116+
LANGUAGE C STRICT;
1117+
1118+
/*
1119+
* Returns max value of the last partition's RangeEntry.
1120+
*/
1121+
CREATE OR REPLACE FUNCTION @extschema@.get_max_range_value(
1122+
parent_relid OID, dummy ANYELEMENT)
1123+
RETURNS ANYELEMENT AS 'pg_pathman', 'get_max_range_value'
1124+
LANGUAGE C STRICT;
1125+
1126+
/*
1127+
* Checks if range overlaps with existing partitions.
1128+
* Returns TRUE if overlaps and FALSE otherwise.
1129+
*/
1130+
CREATE OR REPLACE FUNCTION @extschema@.check_overlap(
1131+
parent_relid OID, range_min ANYELEMENT, range_max ANYELEMENT)
1132+
RETURNS BOOLEAN AS 'pg_pathman', 'check_overlap'
1133+
LANGUAGE C STRICT;
1134+
1135+
/*
1136+
* Needed for an UPDATE trigger.
1137+
*/
1138+
CREATE OR REPLACE FUNCTION @extschema@.find_or_create_range_partition(
1139+
relid OID, value ANYELEMENT)
1140+
RETURNS OID AS 'pg_pathman', 'find_or_create_range_partition'
1141+
LANGUAGE C STRICT;

src/hooks.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
396396

397397
PlannedStmt *result;
398398

399-
/* TODO: fix these commands (traverse whole query tree) */
399+
/* FIXME: fix these commands (traverse whole query tree) */
400400
if (IsPathmanReady())
401401
{
402402
switch(parse->commandType)

src/pl_funcs.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ PG_FUNCTION_INFO_V1( on_partitions_removed );
3030
PG_FUNCTION_INFO_V1( find_or_create_range_partition);
3131
PG_FUNCTION_INFO_V1( get_range_condition );
3232
PG_FUNCTION_INFO_V1( get_range_by_idx );
33-
PG_FUNCTION_INFO_V1( get_partition_range );
33+
PG_FUNCTION_INFO_V1( get_range_by_part_oid );
3434
PG_FUNCTION_INFO_V1( acquire_partitions_lock );
3535
PG_FUNCTION_INFO_V1( release_partitions_lock );
3636
PG_FUNCTION_INFO_V1( check_overlap );
@@ -169,14 +169,10 @@ find_or_create_range_partition(PG_FUNCTION_ARGS)
169169
}
170170

171171
/*
172-
* Returns range (min, max) as output parameters
173-
*
174-
* first argument is the parent relid
175-
* second is the partition relid
176-
* third and forth are MIN and MAX output parameters
172+
* Returns range (min, max) as output parameters.
177173
*/
178174
Datum
179-
get_partition_range(PG_FUNCTION_ARGS)
175+
get_range_by_part_oid(PG_FUNCTION_ARGS)
180176
{
181177
Oid parent_oid = PG_GETARG_OID(0);
182178
Oid child_oid = PG_GETARG_OID(1);

src/relation_info.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ get_pathman_relation_info(Oid relid)
219219
attname = TextDatumGetCString(values[Anum_pathman_config_attname - 1]);
220220

221221
/* Refresh partitioned table cache entry */
222+
/* TODO: possible refactoring, pass found 'prel' instead of searching */
222223
refresh_pathman_relation_info(relid, part_type, attname);
223224
}
224225
/* Else clear remaining cache entry */
@@ -347,6 +348,7 @@ finish_delayed_invalidation(void)
347348
* cache\forget\get PartParentInfo functions.
348349
*/
349350

351+
/* Create "partition+parent" pair in local cache */
350352
void
351353
cache_parent_of_partition(Oid partition, Oid parent)
352354
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy