Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2e8b4bf

Browse files
committed
Qualify table usage in dumpTable() and use regclass
All of the other tables used in the query in dumpTable(), which is collecting column-level ACLs, are qualified, so we should be qualifying the pg_init_privs, the related sub-select against pg_class and the other queries added by the pg_dump catalog ACLs work. Also, use ::regclass (or ::pg_catalog.regclass, where appropriate) instead of using a poorly constructed query to get the OID for various catalog tables. Issues identified by Noah and Alvaro, patch by me.
1 parent 2d2e40e commit 2e8b4bf

File tree

3 files changed

+50
-49
lines changed

3 files changed

+50
-49
lines changed

src/bin/pg_dump/dumputils.c

+12-12
Original file line numberDiff line numberDiff line change
@@ -715,20 +715,20 @@ buildACLQueries(PQExpBuffer acl_subquery, PQExpBuffer racl_subquery,
715715
* these are run the initial privileges will be in place, even in a
716716
* binary upgrade situation (see below).
717717
*/
718-
printfPQExpBuffer(acl_subquery, "(SELECT array_agg(acl) FROM "
719-
"(SELECT unnest(coalesce(%s,acldefault(%s,%s))) AS acl "
718+
printfPQExpBuffer(acl_subquery, "(SELECT pg_catalog.array_agg(acl) FROM "
719+
"(SELECT pg_catalog.unnest(coalesce(%s,pg_catalog.acldefault(%s,%s))) AS acl "
720720
"EXCEPT "
721-
"SELECT unnest(coalesce(pip.initprivs,acldefault(%s,%s)))) as foo)",
721+
"SELECT pg_catalog.unnest(coalesce(pip.initprivs,pg_catalog.acldefault(%s,%s)))) as foo)",
722722
acl_column,
723723
obj_kind,
724724
acl_owner,
725725
obj_kind,
726726
acl_owner);
727727

728-
printfPQExpBuffer(racl_subquery, "(SELECT array_agg(acl) FROM "
729-
"(SELECT unnest(coalesce(pip.initprivs,acldefault(%s,%s))) AS acl "
728+
printfPQExpBuffer(racl_subquery, "(SELECT pg_catalog.array_agg(acl) FROM "
729+
"(SELECT pg_catalog.unnest(coalesce(pip.initprivs,pg_catalog.acldefault(%s,%s))) AS acl "
730730
"EXCEPT "
731-
"SELECT unnest(coalesce(%s,acldefault(%s,%s)))) as foo)",
731+
"SELECT pg_catalog.unnest(coalesce(%s,pg_catalog.acldefault(%s,%s)))) as foo)",
732732
obj_kind,
733733
acl_owner,
734734
acl_column,
@@ -753,19 +753,19 @@ buildACLQueries(PQExpBuffer acl_subquery, PQExpBuffer racl_subquery,
753753
{
754754
printfPQExpBuffer(init_acl_subquery,
755755
"CASE WHEN privtype = 'e' THEN "
756-
"(SELECT array_agg(acl) FROM "
757-
"(SELECT unnest(pip.initprivs) AS acl "
756+
"(SELECT pg_catalog.array_agg(acl) FROM "
757+
"(SELECT pg_catalog.unnest(pip.initprivs) AS acl "
758758
"EXCEPT "
759-
"SELECT unnest(acldefault(%s,%s))) as foo) END",
759+
"SELECT pg_catalog.unnest(pg_catalog.acldefault(%s,%s))) as foo) END",
760760
obj_kind,
761761
acl_owner);
762762

763763
printfPQExpBuffer(init_racl_subquery,
764764
"CASE WHEN privtype = 'e' THEN "
765-
"(SELECT array_agg(acl) FROM "
766-
"(SELECT unnest(acldefault(%s,%s)) AS acl "
765+
"(SELECT pg_catalog.array_agg(acl) FROM "
766+
"(SELECT pg_catalog.unnest(pg_catalog.acldefault(%s,%s)) AS acl "
767767
"EXCEPT "
768-
"SELECT unnest(pip.initprivs)) as foo) END",
768+
"SELECT pg_catalog.unnest(pip.initprivs)) as foo) END",
769769
obj_kind,
770770
acl_owner);
771771
}

src/bin/pg_dump/pg_dump.c

+34-33
Original file line numberDiff line numberDiff line change
@@ -2825,8 +2825,8 @@ getBlobs(Archive *fout)
28252825
"%s AS initrlomacl "
28262826
"FROM pg_largeobject_metadata l "
28272827
"LEFT JOIN pg_init_privs pip ON "
2828-
"(l.oid = pip.objoid AND pip.classoid = "
2829-
"(SELECT oid FROM pg_class WHERE relname = 'pg_largeobject')"
2828+
"(l.oid = pip.objoid "
2829+
"AND pip.classoid = 'pg_largeobject'::regclass "
28302830
"AND pip.objsubid = 0) ",
28312831
username_subquery,
28322832
acl_subquery->data,
@@ -3569,8 +3569,8 @@ getNamespaces(Archive *fout, int *numNamespaces)
35693569
"%s as initrnspacl "
35703570
"FROM pg_namespace n "
35713571
"LEFT JOIN pg_init_privs pip "
3572-
"ON (n.oid = pip.objoid AND pip.classoid = "
3573-
"(SELECT oid FROM pg_class WHERE relname = 'pg_namespace') "
3572+
"ON (n.oid = pip.objoid "
3573+
"AND pip.classoid = 'pg_namespace'::regclass "
35743574
"AND pip.objsubid = 0) ",
35753575
username_subquery,
35763576
acl_subquery->data,
@@ -3851,9 +3851,9 @@ getTypes(Archive *fout, int *numTypes)
38513851
"t.typname[0] = '_' AND t.typelem != 0 AND "
38523852
"(SELECT typarray FROM pg_type te WHERE oid = t.typelem) = t.oid AS isarray "
38533853
"FROM pg_type t "
3854-
"LEFT JOIN pg_init_privs pip "
3855-
"ON (t.oid = pip.objoid AND pip.classoid = "
3856-
"(SELECT oid FROM pg_class WHERE relname = 'pg_type') "
3854+
"LEFT JOIN pg_init_privs pip ON "
3855+
"(t.oid = pip.objoid "
3856+
"AND pip.classoid = 'pg_type'::regclass "
38573857
"AND pip.objsubid = 0) ",
38583858
acl_subquery->data,
38593859
racl_subquery->data,
@@ -4713,8 +4713,8 @@ getAggregates(Archive *fout, int *numAggs)
47134713
"%s AS initraggacl "
47144714
"FROM pg_proc p "
47154715
"LEFT JOIN pg_init_privs pip ON "
4716-
"(p.oid = pip.objoid AND pip.classoid = "
4717-
"(SELECT oid FROM pg_class WHERE relname = 'pg_proc') "
4716+
"(p.oid = pip.objoid "
4717+
"AND pip.classoid = 'pg_proc'::regclass "
47184718
"AND pip.objsubid = 0) "
47194719
"WHERE p.proisagg AND ("
47204720
"p.pronamespace != "
@@ -4956,8 +4956,8 @@ getFuncs(Archive *fout, int *numFuncs)
49564956
"(%s p.proowner) AS rolname "
49574957
"FROM pg_proc p "
49584958
"LEFT JOIN pg_init_privs pip ON "
4959-
"(p.oid = pip.objoid AND pip.classoid = "
4960-
"(SELECT oid FROM pg_class WHERE relname = 'pg_proc') "
4959+
"(p.oid = pip.objoid "
4960+
"AND pip.classoid = 'pg_proc'::regclass "
49614961
"AND pip.objsubid = 0) "
49624962
"WHERE NOT proisagg "
49634963
"AND NOT EXISTS (SELECT 1 FROM pg_depend "
@@ -5246,9 +5246,10 @@ getTables(Archive *fout, int *numTables)
52465246
"CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
52475247
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, "
52485248
"tc.reloptions AS toast_reloptions, "
5249-
"EXISTS (SELECT 1 FROM pg_attribute at LEFT JOIN pg_init_privs pip ON"
5250-
"(c.oid = pip.objoid AND pip.classoid = "
5251-
"(SELECT oid FROM pg_class WHERE relname = 'pg_class') AND pip.objsubid = at.attnum)"
5249+
"EXISTS (SELECT 1 FROM pg_attribute at LEFT JOIN pg_init_privs pip ON "
5250+
"(c.oid = pip.objoid "
5251+
"AND pip.classoid = 'pg_class'::regclass "
5252+
"AND pip.objsubid = at.attnum)"
52525253
"WHERE at.attrelid = c.oid AND ("
52535254
"%s IS NOT NULL "
52545255
"OR %s IS NOT NULL "
@@ -5264,9 +5265,9 @@ getTables(Archive *fout, int *numTables)
52645265
"d.refclassid = c.tableoid AND d.deptype = 'a') "
52655266
"LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid) "
52665267
"LEFT JOIN pg_init_privs pip ON "
5267-
"(c.oid = pip.objoid AND pip.classoid = "
5268-
"(SELECT oid FROM pg_class "
5269-
"WHERE relname = 'pg_class') AND pip.objsubid = 0) "
5268+
"(c.oid = pip.objoid "
5269+
"AND pip.classoid = 'pg_class'::regclass "
5270+
"AND pip.objsubid = 0) "
52705271
"WHERE c.relkind in ('%c', '%c', '%c', '%c', '%c', '%c') "
52715272
"ORDER BY c.oid",
52725273
acl_subquery->data,
@@ -7163,9 +7164,9 @@ getProcLangs(Archive *fout, int *numProcLangs)
71637164
"%s AS initrlanacl, "
71647165
"(%s l.lanowner) AS lanowner "
71657166
"FROM pg_language l "
7166-
"LEFT JOIN pg_init_privs pip "
7167-
"ON (l.oid = pip.objoid AND pip.classoid = "
7168-
"(SELECT oid FROM pg_class WHERE relname = 'pg_type') "
7167+
"LEFT JOIN pg_init_privs pip ON "
7168+
"(l.oid = pip.objoid "
7169+
"AND pip.classoid = 'pg_type'::regclass "
71697170
"AND pip.objsubid = 0) "
71707171
"WHERE l.lanispl "
71717172
"ORDER BY l.oid",
@@ -8583,9 +8584,9 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
85838584
"ORDER BY option_name"
85848585
"), E',\n ') AS fdwoptions "
85858586
"FROM pg_foreign_data_wrapper f "
8586-
"LEFT JOIN pg_init_privs pip "
8587-
"ON (f.oid = pip.objoid AND pip.classoid = "
8588-
"(SELECT oid FROM pg_class WHERE relname = 'pg_foreign_data_wrapper') "
8587+
"LEFT JOIN pg_init_privs pip ON "
8588+
"(f.oid = pip.objoid "
8589+
"AND pip.classoid = 'pg_foreign_data_wrapper'::regclass "
85898590
"AND pip.objsubid = 0) ",
85908591
username_subquery,
85918592
acl_subquery->data,
@@ -8753,8 +8754,8 @@ getForeignServers(Archive *fout, int *numForeignServers)
87538754
"), E',\n ') AS srvoptions "
87548755
"FROM pg_foreign_server f "
87558756
"LEFT JOIN pg_init_privs pip "
8756-
"ON (f.oid = pip.objoid AND pip.classoid = "
8757-
"(SELECT oid FROM pg_class WHERE relname = 'pg_foreign_server') "
8757+
"ON (f.oid = pip.objoid "
8758+
"AND pip.classoid = 'pg_foreign_server'::regclass "
87588759
"AND pip.objsubid = 0) ",
87598760
username_subquery,
87608761
acl_subquery->data,
@@ -14600,13 +14601,13 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
1460014601
*/
1460114602
if (strlen(initacls) != 0 || strlen(initracls) != 0)
1460214603
{
14603-
appendPQExpBuffer(sql, "SELECT binary_upgrade_set_record_init_privs(true);\n");
14604+
appendPQExpBuffer(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\n");
1460414605
if (!buildACLCommands(name, subname, type, initacls, initracls, owner,
1460514606
"", fout->remoteVersion, sql))
1460614607
exit_horribly(NULL,
1460714608
"could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)\n",
1460814609
initacls, initracls, name, type);
14609-
appendPQExpBuffer(sql, "SELECT binary_upgrade_set_record_init_privs(false);\n");
14610+
appendPQExpBuffer(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n");
1461014611
}
1461114612

1461214613
if (!buildACLCommands(name, subname, type, acls, racls, owner,
@@ -14992,11 +14993,11 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
1499214993
"%s AS initrattacl "
1499314994
"FROM pg_catalog.pg_attribute at "
1499414995
"JOIN pg_catalog.pg_class c ON (at.attrelid = c.oid) "
14995-
"LEFT JOIN pg_init_privs pip ON "
14996-
"(pip.classoid = "
14997-
"(SELECT oid FROM pg_class WHERE relname = 'pg_class') AND "
14998-
" at.attrelid = pip.objoid AND at.attnum = pip.objsubid) "
14999-
"WHERE at.attrelid = '%u' AND "
14996+
"LEFT JOIN pg_catalog.pg_init_privs pip ON "
14997+
"(at.attrelid = pip.objoid "
14998+
"AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
14999+
"AND at.attnum = pip.objsubid) "
15000+
"WHERE at.attrelid = '%u'::pg_catalog.oid AND "
1500015001
"NOT at.attisdropped "
1500115002
"AND ("
1500215003
"%s IS NOT NULL OR "
@@ -15025,7 +15026,7 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
1502515026
"SELECT attname, attacl, NULL as rattacl, "
1502615027
"NULL AS initattacl, NULL AS initrattacl "
1502715028
"FROM pg_catalog.pg_attribute "
15028-
"WHERE attrelid = '%u' AND NOT attisdropped "
15029+
"WHERE attrelid = '%u'::pg_catalog.oid AND NOT attisdropped "
1502915030
"AND attacl IS NOT NULL "
1503015031
"ORDER BY attnum",
1503115032
tbinfo->dobj.catId.oid);

src/test/modules/test_pg_dump/t/001_base.pl

+4-4
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,9 @@
340340
},
341341
'GRANT SELECT ON TABLE regress_pg_dump_table' => {
342342
regexp => qr/^
343-
\QSELECT binary_upgrade_set_record_init_privs(true);\E\n
343+
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
344344
\QGRANT SELECT ON TABLE regress_pg_dump_table TO dump_test;\E\n
345-
\QSELECT binary_upgrade_set_record_init_privs(false);\E
345+
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
346346
$/xms,
347347
like => {
348348
binary_upgrade => 1,
@@ -362,9 +362,9 @@
362362
},
363363
'GRANT SELECT(col1) ON regress_pg_dump_table' => {
364364
regexp => qr/^
365-
\QSELECT binary_upgrade_set_record_init_privs(true);\E\n
365+
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
366366
\QGRANT SELECT(col1) ON TABLE regress_pg_dump_table TO PUBLIC;\E\n
367-
\QSELECT binary_upgrade_set_record_init_privs(false);\E
367+
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
368368
$/xms,
369369
like => {
370370
binary_upgrade => 1,

0 commit comments

Comments
 (0)