mirror of https://github.com/postgres/postgres
pg_partition_ancestors
Adds another introspection feature for partitioning, necessary for further psql patches. Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/20190226222757.GA31622@alvherre.pgsql
This commit is contained in:
parent
d12fbe2f8e
commit
b96f6b1948
|
@ -20274,6 +20274,17 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup());
|
||||||
their partitions, and so on.
|
their partitions, and so on.
|
||||||
</entry>
|
</entry>
|
||||||
</row>
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>
|
||||||
|
<indexterm><primary>pg_partition_ancestors</primary></indexterm>
|
||||||
|
<literal><function>pg_partition_ancestors(<type>regclass</type>)</function></literal>
|
||||||
|
</entry>
|
||||||
|
<entry><type>setof regclass</type></entry>
|
||||||
|
<entry>
|
||||||
|
List the ancestor relations of the given partition,
|
||||||
|
including the partition itself.
|
||||||
|
</entry>
|
||||||
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>
|
<entry>
|
||||||
<indexterm><primary>pg_partition_root</primary></indexterm>
|
<indexterm><primary>pg_partition_root</primary></indexterm>
|
||||||
|
|
|
@ -201,3 +201,52 @@ pg_partition_root(PG_FUNCTION_ARGS)
|
||||||
Assert(OidIsValid(rootrelid));
|
Assert(OidIsValid(rootrelid));
|
||||||
PG_RETURN_OID(rootrelid);
|
PG_RETURN_OID(rootrelid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_partition_ancestors
|
||||||
|
*
|
||||||
|
* Produces a view with one row per ancestor of the given partition,
|
||||||
|
* including the input relation itself.
|
||||||
|
*/
|
||||||
|
Datum
|
||||||
|
pg_partition_ancestors(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
Oid relid = PG_GETARG_OID(0);
|
||||||
|
FuncCallContext *funcctx;
|
||||||
|
ListCell **next;
|
||||||
|
|
||||||
|
if (SRF_IS_FIRSTCALL())
|
||||||
|
{
|
||||||
|
MemoryContext oldcxt;
|
||||||
|
List *ancestors;
|
||||||
|
|
||||||
|
funcctx = SRF_FIRSTCALL_INIT();
|
||||||
|
|
||||||
|
if (!check_rel_can_be_partition(relid))
|
||||||
|
SRF_RETURN_DONE(funcctx);
|
||||||
|
|
||||||
|
oldcxt = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
|
||||||
|
|
||||||
|
ancestors = get_partition_ancestors(relid);
|
||||||
|
ancestors = lcons_oid(relid, ancestors);
|
||||||
|
|
||||||
|
next = (ListCell **) palloc(sizeof(ListCell *));
|
||||||
|
*next = list_head(ancestors);
|
||||||
|
funcctx->user_fctx = (void *) next;
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
funcctx = SRF_PERCALL_SETUP();
|
||||||
|
next = (ListCell **) funcctx->user_fctx;
|
||||||
|
|
||||||
|
if (*next != NULL)
|
||||||
|
{
|
||||||
|
Oid relid = lfirst_oid(*next);
|
||||||
|
|
||||||
|
*next = lnext(*next);
|
||||||
|
SRF_RETURN_NEXT(funcctx, ObjectIdGetDatum(relid));
|
||||||
|
}
|
||||||
|
|
||||||
|
SRF_RETURN_DONE(funcctx);
|
||||||
|
}
|
||||||
|
|
|
@ -53,6 +53,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 201902161
|
#define CATALOG_VERSION_NO 201903041
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -10528,6 +10528,11 @@
|
||||||
proargmodes => '{i,o,o,o,o}',
|
proargmodes => '{i,o,o,o,o}',
|
||||||
proargnames => '{rootrelid,relid,parentrelid,isleaf,level}',
|
proargnames => '{rootrelid,relid,parentrelid,isleaf,level}',
|
||||||
prosrc => 'pg_partition_tree' },
|
prosrc => 'pg_partition_tree' },
|
||||||
|
{ oid => '3425', descr => 'view ancestors of the partition',
|
||||||
|
proname => 'pg_partition_ancestors', prorows => '10', proretset => 't',
|
||||||
|
provolatile => 'v', prorettype => 'regclass', proargtypes => 'regclass',
|
||||||
|
proallargtypes => '{regclass,regclass}', proargmodes => '{i,o}',
|
||||||
|
proargnames => '{partitionid,relid}', prosrc => 'pg_partition_ancestors' },
|
||||||
|
|
||||||
# function to get the top-most partition root parent
|
# function to get the top-most partition root parent
|
||||||
{ oid => '3424', descr => 'get top-most partition root parent',
|
{ oid => '3424', descr => 'get top-most partition root parent',
|
||||||
|
|
|
@ -11,6 +11,16 @@ SELECT * FROM pg_partition_tree(0);
|
||||||
-------+-------------+--------+-------
|
-------+-------------+--------+-------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors(NULL);
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors(0);
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
SELECT pg_partition_root(NULL);
|
SELECT pg_partition_root(NULL);
|
||||||
pg_partition_root
|
pg_partition_root
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -92,6 +102,21 @@ SELECT relid, parentrelid, level, isleaf
|
||||||
ptif_test3 | ptif_test | 0 | f
|
ptif_test3 | ptif_test | 0 | f
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- List all ancestors of root and leaf tables
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test01');
|
||||||
|
relid
|
||||||
|
-------------
|
||||||
|
ptif_test01
|
||||||
|
ptif_test0
|
||||||
|
ptif_test
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test');
|
||||||
|
relid
|
||||||
|
-----------
|
||||||
|
ptif_test
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- List all members using pg_partition_root with leaf table reference
|
-- List all members using pg_partition_root with leaf table reference
|
||||||
SELECT relid, parentrelid, level, isleaf
|
SELECT relid, parentrelid, level, isleaf
|
||||||
FROM pg_partition_tree(pg_partition_root('ptif_test01')) p
|
FROM pg_partition_tree(pg_partition_root('ptif_test01')) p
|
||||||
|
@ -164,6 +189,21 @@ SELECT relid, parentrelid, level, isleaf
|
||||||
ptif_test11_index | ptif_test1_index | 2 | t
|
ptif_test11_index | ptif_test1_index | 2 | t
|
||||||
(7 rows)
|
(7 rows)
|
||||||
|
|
||||||
|
-- List all ancestors of root and leaf indexes
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test01_index');
|
||||||
|
relid
|
||||||
|
-------------------
|
||||||
|
ptif_test01_index
|
||||||
|
ptif_test0_index
|
||||||
|
ptif_test_index
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_index');
|
||||||
|
relid
|
||||||
|
-----------------
|
||||||
|
ptif_test_index
|
||||||
|
(1 row)
|
||||||
|
|
||||||
DROP TABLE ptif_test;
|
DROP TABLE ptif_test;
|
||||||
-- Table that is not part of any partition tree is not listed.
|
-- Table that is not part of any partition tree is not listed.
|
||||||
CREATE TABLE ptif_normal_table(a int);
|
CREATE TABLE ptif_normal_table(a int);
|
||||||
|
@ -173,6 +213,11 @@ SELECT relid, parentrelid, level, isleaf
|
||||||
-------+-------------+-------+--------
|
-------+-------------+-------+--------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_normal_table');
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
SELECT pg_partition_root('ptif_normal_table');
|
SELECT pg_partition_root('ptif_normal_table');
|
||||||
pg_partition_root
|
pg_partition_root
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -207,6 +252,26 @@ SELECT * FROM pg_partition_tree('ptif_li_child');
|
||||||
-------+-------------+--------+-------
|
-------+-------------+--------+-------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_view');
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_matview');
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_li_parent');
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_li_child');
|
||||||
|
relid
|
||||||
|
-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
SELECT pg_partition_root('ptif_test_view');
|
SELECT pg_partition_root('ptif_test_view');
|
||||||
pg_partition_root
|
pg_partition_root
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
--
|
--
|
||||||
SELECT * FROM pg_partition_tree(NULL);
|
SELECT * FROM pg_partition_tree(NULL);
|
||||||
SELECT * FROM pg_partition_tree(0);
|
SELECT * FROM pg_partition_tree(0);
|
||||||
|
SELECT * FROM pg_partition_ancestors(NULL);
|
||||||
|
SELECT * FROM pg_partition_ancestors(0);
|
||||||
SELECT pg_partition_root(NULL);
|
SELECT pg_partition_root(NULL);
|
||||||
SELECT pg_partition_root(0);
|
SELECT pg_partition_root(0);
|
||||||
|
|
||||||
|
@ -50,6 +52,9 @@ SELECT relid, parentrelid, level, isleaf
|
||||||
SELECT relid, parentrelid, level, isleaf
|
SELECT relid, parentrelid, level, isleaf
|
||||||
FROM pg_partition_tree('ptif_test3') p
|
FROM pg_partition_tree('ptif_test3') p
|
||||||
JOIN pg_class c ON (p.relid = c.oid);
|
JOIN pg_class c ON (p.relid = c.oid);
|
||||||
|
-- List all ancestors of root and leaf tables
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test01');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test');
|
||||||
-- List all members using pg_partition_root with leaf table reference
|
-- List all members using pg_partition_root with leaf table reference
|
||||||
SELECT relid, parentrelid, level, isleaf
|
SELECT relid, parentrelid, level, isleaf
|
||||||
FROM pg_partition_tree(pg_partition_root('ptif_test01')) p
|
FROM pg_partition_tree(pg_partition_root('ptif_test01')) p
|
||||||
|
@ -74,6 +79,9 @@ SELECT relid, parentrelid, level, isleaf
|
||||||
SELECT relid, parentrelid, level, isleaf
|
SELECT relid, parentrelid, level, isleaf
|
||||||
FROM pg_partition_tree(pg_partition_root('ptif_test01_index')) p
|
FROM pg_partition_tree(pg_partition_root('ptif_test01_index')) p
|
||||||
JOIN pg_class c ON (p.relid = c.oid);
|
JOIN pg_class c ON (p.relid = c.oid);
|
||||||
|
-- List all ancestors of root and leaf indexes
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test01_index');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_index');
|
||||||
|
|
||||||
DROP TABLE ptif_test;
|
DROP TABLE ptif_test;
|
||||||
|
|
||||||
|
@ -81,6 +89,7 @@ DROP TABLE ptif_test;
|
||||||
CREATE TABLE ptif_normal_table(a int);
|
CREATE TABLE ptif_normal_table(a int);
|
||||||
SELECT relid, parentrelid, level, isleaf
|
SELECT relid, parentrelid, level, isleaf
|
||||||
FROM pg_partition_tree('ptif_normal_table');
|
FROM pg_partition_tree('ptif_normal_table');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_normal_table');
|
||||||
SELECT pg_partition_root('ptif_normal_table');
|
SELECT pg_partition_root('ptif_normal_table');
|
||||||
DROP TABLE ptif_normal_table;
|
DROP TABLE ptif_normal_table;
|
||||||
|
|
||||||
|
@ -95,6 +104,10 @@ SELECT * FROM pg_partition_tree('ptif_test_view');
|
||||||
SELECT * FROM pg_partition_tree('ptif_test_matview');
|
SELECT * FROM pg_partition_tree('ptif_test_matview');
|
||||||
SELECT * FROM pg_partition_tree('ptif_li_parent');
|
SELECT * FROM pg_partition_tree('ptif_li_parent');
|
||||||
SELECT * FROM pg_partition_tree('ptif_li_child');
|
SELECT * FROM pg_partition_tree('ptif_li_child');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_view');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_test_matview');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_li_parent');
|
||||||
|
SELECT * FROM pg_partition_ancestors('ptif_li_child');
|
||||||
SELECT pg_partition_root('ptif_test_view');
|
SELECT pg_partition_root('ptif_test_view');
|
||||||
SELECT pg_partition_root('ptif_test_matview');
|
SELECT pg_partition_root('ptif_test_matview');
|
||||||
SELECT pg_partition_root('ptif_li_parent');
|
SELECT pg_partition_root('ptif_li_parent');
|
||||||
|
|
Loading…
Reference in New Issue