--- describe.c 2023-06-08 08:31:12.594000000 +0000 +++ describe_change.c 2023-06-08 08:33:54.807000000 +0000 @@ -3370,33 +3370,97 @@ /* print child tables (with additional info if partitions) */ if (pset.sversion >= 140000) printfPQExpBuffer(&buf, - "SELECT c.oid::pg_catalog.regclass, c.relkind," - " inhdetachpending," - " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n" - "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n" - "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n" - "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT'," - " c.oid::pg_catalog.regclass::pg_catalog.text;", - oid); - else if (pset.sversion >= 100000) + "WITH RECURSIVE partition_tree AS ( " + " SELECT c.oid::pg_catalog.regclass AS object_name, " + " c.oid," + " 0 AS level," + " c.relkind," + " i.inhdetachpending," + " pg_get_expr(c.relpartbound, c.oid) AS relpartbound," + " array[c.relname::text] AS path \n" + " FROM pg_catalog.pg_class c \n" + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid \n" + " WHERE i.inhparent ='%s' \n" + " UNION ALL \n" + " SELECT c.oid::pg_catalog.regclass AS object_name," + " c.oid," + " pt.level + 1 AS level," + " c.relkind," + " i.inhdetachpending," + " pg_get_expr(c.relpartbound, c.oid) AS relpartbound," + " pt.path || c.relname::text \n" + " FROM pg_catalog.pg_class c \n" + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid \n" + " JOIN partition_tree pt ON i.inhparent = pt.oid )\n" + " SELECT REPEAT(E'\t', level) || object_name AS oid," + " relkind," + " inhdetachpending," + " relpartbound as pg_get_expr \n" + "FROM partition_tree t \n" + "ORDER BY path, array_to_string(t.path || array[t.object_name::text], '.'), t.object_name, relpartbound = 'DEFAULT';", + oid); + else if (pset.sversion >= 100000) printfPQExpBuffer(&buf, - "SELECT c.oid::pg_catalog.regclass, c.relkind," - " false AS inhdetachpending," - " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n" - "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n" - "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n" - "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT'," - " c.oid::pg_catalog.regclass::pg_catalog.text;", - oid); + "WITH RECURSIVE partition_tree AS (\n" + " SELECT c.oid::pg_catalog.regclass AS partition_name," + " c.oid," + " 0 AS level," + " c.relkind," + " false AS i.inhdetachpending," + " pg_catalog.pg_get_expr(c.relpartbound, c.oid) AS relpartbound" + " array[c.relname::text] AS path \n" + " FROM pg_catalog.pg_class c " + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid\n" + " WHERE i.inhparent = '%s'\n" + " UNION ALL" + " SELECT c.oid::pg_catalog.regclass AS partition_name," + " c.oid," + " pt.level + 1 AS level," + " c.relkind," + " false AS i.inhdetachpending," + " pg_catalog.pg_get_expr(c.relpartbound, c.oid) AS relpartbound" + " pt.path || c.relname::text\n" + " FROM pg_catalog.pg_class c" + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid" + " JOIN partition_tree pt ON i.inhparent = pt.oid" + ")\n" + "SELECT REPEAT(' ', level * 4) || partition_name AS oid," + " relkind," + " inhdetachpending," + " relpartbound as pg_get_expr\n" + "FROM partition_tree\n" + "ORDER BY partition_name::pg_catalog.text, level, relpartbound = 'DEFAULT';", + oid); else printfPQExpBuffer(&buf, - "SELECT c.oid::pg_catalog.regclass, c.relkind," - " false AS inhdetachpending, NULL\n" - "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n" - "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n" - "ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text;", - oid); - + "WITH RECURSIVE partition_tree AS (\n" + " SELECT c.oid::pg_catalog.regclass AS partition_name," + " c.oid," + " 0 AS level," + " c.relkind," + " false AS i.inhdetachpending," + " array[c.relname::text] AS path \n" + " FROM pg_catalog.pg_class c " + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid\n" + " WHERE i.inhparent = '%s'\n" + " UNION ALL" + " SELECT c.oid::pg_catalog.regclass AS partition_name," + " c.oid," + " pt.level + 1 AS level," + " c.relkind," + " false AS i.inhdetachpending," + " pt.path || c.relname::text\n" + " FROM pg_catalog.pg_class c" + " JOIN pg_catalog.pg_inherits i ON c.oid = i.inhrelid" + " JOIN partition_tree pt ON i.inhparent = pt.oid" + ")\n" + "SELECT REPEAT(' ', level * 4) || partition_name AS oid," + " relkind," + " inhdetachpending," + " NULL\n" + "FROM partition_tree\n" + "ORDER BY partition_name::pg_catalog.text, level, relpartbound = 'DEFAULT';", + oid); result = PSQLexec(buf.data); if (!result) goto error_return; @@ -3443,9 +3507,6 @@ ctw, "", PQgetvalue(result, i, 0)); if (!PQgetisnull(result, i, 3)) appendPQExpBuffer(&buf, " %s", PQgetvalue(result, i, 3)); - if (child_relkind == RELKIND_PARTITIONED_TABLE || - child_relkind == RELKIND_PARTITIONED_INDEX) - appendPQExpBufferStr(&buf, ", PARTITIONED"); if (strcmp(PQgetvalue(result, i, 2), "t") == 0) appendPQExpBufferStr(&buf, " (DETACH PENDING)"); if (i < tuples - 1)