Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mpJZJ-000854-Jk for pgsql-hackers@arkaria.postgresql.org; Tue, 23 Nov 2021 00:21:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mpJZH-0001t8-2P for pgsql-hackers@arkaria.postgresql.org; Tue, 23 Nov 2021 00:21:51 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mpJZF-0001sy-QH for pgsql-hackers@lists.postgresql.org; Tue, 23 Nov 2021 00:21:50 +0000 Received: from mail-pj1-x102b.google.com ([2607:f8b0:4864:20::102b]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mpJZC-0005cZ-55 for pgsql-hackers@postgresql.org; Tue, 23 Nov 2021 00:21:48 +0000 Received: by mail-pj1-x102b.google.com with SMTP id np3so15143280pjb.4 for ; Mon, 22 Nov 2021 16:21:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=xIr8fRh/tKyabSE2ctElqGd8TjuIOPBORw3YQzSmwf8=; b=GIjfuxQ/YMCtyeT66+Wkimo9f7gk8kQzGA0TG8RniUFHcjM43CwcKWgp6t3pj/I5ei fD2Mq/GOYJG0V4h9WQpcQwBwvvwSGB/vJ+vK4ntu43Grg7m6gML6GKduxTxmIaKGVv9D 2mWDSjP/us6FuRLaui+62267WwcQS2tdwCS3ypYGxtV6/lrDztp8s3cz+LWaUoJ/gPlI 9oH9uEcsuVyiGAe3YuJn898Sc23Yukmym1nlHC2LLmHO6+k2IIjzWdf1qEkZHeMsy0jG h37+VTOaEPd6VAz9gbQSvmUyc/YWAZk/jaLoYP6ljsd0omYPSDZe2uG9wDW+exasAApr KzIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=xIr8fRh/tKyabSE2ctElqGd8TjuIOPBORw3YQzSmwf8=; b=r8FkxTDu8T0JHLem5d/YJ45ToeG7eKe56p7HtKuExAWvJWK48LgYmSpHE7w6KXIqo5 VqB/GzdG7DKNlvbNJVSELw7Gw3u5b09E6AiWYWCmGMY1UTX2QB2VXUNd+eZTYneKdX3P sQxlITQ9L+4KrrSMLky7JDBhKON/NxOS0cF9n8B2vtVuSpYvYeGc6akj66RIyhqmewm0 yarPh4coMWRUNVf7nQX+IGnS/r7FuDie09rCTMlqphtvmD8tAY9WLQFvsccffDIPkZCF y2Ui9i2TmISy6FpCUZnzWMSKj4A1jMz8qoLillnZ867nGZP3Wd9HVbNsGb+iqDwA78CH Ru9Q== X-Gm-Message-State: AOAM532/NgopL947QxKb/EnxD/kZhol5lCbDesYj32PtgCms8pLlcXHk B1c0NrdBHgvt7+hmi3XXQCNmBHJvb8l2FxuMgRr+TzkA9CA3J6CKl1jfhaLDwU4PNWG4zvnwUXJ 3fjZ1dWI6hnTx4p7j2JD5ZqnLv99ePGQvBp4eJ0BlmJfh5BoCvCfTZmls/X2ZqLq6ajvL3qSwCQ R2xeIsoix3upruydA7RxJFBC6Coze6OZJJxiOx X-Google-Smtp-Source: ABdhPJx/fFAy+on/IYCgIhE56dBSbXYza6eYSIUECAWORV/kAF5Tl45Fs9M0mMJAVW02gLYagBlo3A== X-Received: by 2002:a17:90b:3a85:: with SMTP id om5mr38003628pjb.28.1637626904762; Mon, 22 Nov 2021 16:21:44 -0800 (PST) Received: from laptop280-ma-us.hitronhub.home (24-113-193-150.wavecable.com. [24.113.193.150]) by smtp.gmail.com with ESMTPSA id j22sm9869062pfj.130.2021.11.22.16.21.43 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Nov 2021 16:21:44 -0800 (PST) From: Mark Dilger Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_A50C4BFD-E863-4175-A9FC-56A1EF873A7A" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: Re: Granting SET and ALTER SYSTE privileges for GUCs Date: Mon, 22 Nov 2021 16:21:42 -0800 In-Reply-To: Cc: PostgreSQL-development , Tom Lane To: Robert Haas , Andrew Dunstan , Jeff Davis References: <3D691E20-C1D5-4B80-8BA5-6BEB63AF3029@enterprisedb.com> X-Mailer: Apple Mail (2.3608.120.23.2.7) X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_A50C4BFD-E863-4175-A9FC-56A1EF873A7A Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii > On Nov 16, 2021, at 7:03 AM, Robert Haas = wrote: >=20 > It's also going to be important to think about what happens with > extension GUCs. If somebody installs an extension, we can't ask them > to perform a manual step in order to be able to grant privileges. And > if somebody then loads up a different .so for that extension, the set > of GUCs that it provides can change without any DDL being executed. > New GUCs could appear, and old GUCs could vanish. The v3 patch allows grants on unrecognized guc names. This should allow = a grant statement to precede the loading of a new .so which provides the = named guc. > instead just adjust the GRANT command to automatically insert a new > row into the relevant catalog if there isn't one already. That seems > nicer for extensions, and also nicer for core GUCs, since it avoids > bloating the catalog with a bunch of entries that aren't needed. Grants on GUCs create a new catalog entry if necessary, or update the = existing catalog entry if found. There is a new information_schema.guc_privileges view, not present in = v2. --Apple-Mail=_A50C4BFD-E863-4175-A9FC-56A1EF873A7A Content-Disposition: attachment; filename=v3-0001-Allow-GRANT-of-SET-and-ALTER-SYSTEM-for-variables.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v3-0001-Allow-GRANT-of-SET-and-ALTER-SYSTEM-for-variables.patch" Content-Transfer-Encoding: quoted-printable =46rom=2015c1c6fb86e2569fb498defa1e77ca25a770d074=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Mark=20Dilger=20=0A= Date:=20Mon,=2015=20Nov=202021=2009:19:22=20-0800=0ASubject:=20[PATCH=20= v3]=20Allow=20GRANT=20of=20SET=20and=20ALTER=20SYSTEM=20for=20variables=0A= =0AAllow=20granting=20of=20privilege=20to=20set=20or=20alter=20system=20= set=20variables=0Awhich=20otherwise=20can=20only=20be=20managed=20by=20= superusers.=20=20Each=0A(role,variable,privilege)=20triple=20is=20= independently=20grantable,=20so=20a=0Auser=20may=20be=20granted=20= privilege=20to=20SET=20but=20not=20to=20ALTER=20SYSTEM=20SET=20on=0Aa=20= variable,=20or=20vice=20versa.=20=20The=20privilege=20to=20SET=20a=20= userset=20variable=0Amay=20be=20granted,=20though=20doing=20so=20has=20= no=20practical=20effect,=20since=20any=0Arole=20can=20set=20userset=20= variables=20anyway.=0A---=0A=20doc/src/sgml/catalogs.sgml=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20=2063=20+++++=0A=20= doc/src/sgml/ddl.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20=2039=20++-=0A=20doc/src/sgml/ref/grant.sgml=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=207=20+=0A=20= doc/src/sgml/ref/set.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=20=205=20+-=0A=20src/backend/catalog/Makefile=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20=20=203=20+-=0A=20= src/backend/catalog/aclchk.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20251=20++++++++++++++++++++=0A=20src/backend/catalog/catalog.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=206=20+=0A=20= src/backend/catalog/dependency.c=20=20=20=20=20=20=20=20=20=20=20=20|=20=20= =206=20+=0A=20src/backend/catalog/information_schema.sql=20=20|=20=2019=20= ++=0A=20src/backend/catalog/objectaddress.c=20=20=20=20=20=20=20=20=20|=20= =2046=20++++=0A=20src/backend/catalog/pg_config_param.c=20=20=20=20=20=20= =20|=20126=20++++++++++=0A=20src/backend/commands/alter.c=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/backend/commands/dropcmds.c=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= =20=207=20+=0A=20src/backend/commands/event_trigger.c=20=20=20=20=20=20=20= =20|=20=20=206=20+=0A=20src/backend/commands/seclabel.c=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/backend/commands/tablecmds.c=20=20=20=20=20=20=20=20=20=20=20=20|=20=20= =201=20+=0A=20src/backend/parser/gram.y=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=2099=20+++++++-=0A=20= src/backend/utils/adt/acl.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=2058=20+++++=0A=20src/backend/utils/cache/lsyscache.c=20=20=20=20= =20=20=20=20=20|=20=2020=20++=0A=20src/backend/utils/cache/syscache.c=20=20= =20=20=20=20=20=20=20=20|=20=2023=20++=0A=20src/backend/utils/misc/guc.c=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20107=20+++++++--=0A=20= src/bin/pg_dump/dumputils.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=20=207=20+-=0A=20src/bin/pg_dump/pg_backup_archiver.c=20=20=20=20= =20=20=20=20|=20=20=202=20+=0A=20src/bin/pg_dump/pg_dump.c=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=205=20+-=0A=20= src/bin/pg_dump/pg_dumpall.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=2071=20++++++=0A=20src/include/catalog/dependency.h=20=20=20=20=20= =20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/include/catalog/pg_config_param.h=20=20=20=20=20=20=20|=20=2063=20= +++++=0A=20src/include/catalog/pg_default_acl.h=20=20=20=20=20=20=20=20|=20= =20=201=20+=0A=20src/include/nodes/parsenodes.h=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20=20=205=20+-=0A=20src/include/parser/kwlist.h=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/include/tcop/cmdtaglist.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=20=202=20+=0A=20src/include/utils/acl.h=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20=2010=20+-=0A=20= src/include/utils/guc.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20|=20=20=202=20+=0A=20src/include/utils/lsyscache.h=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/include/utils/syscache.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=20=202=20+=0A=20src/test/modules/test_pg_dump/t/001_base.pl=20|=20= =2054=20++++-=0A=20src/test/regress/expected/guc_privs.out=20=20=20=20=20= |=20204=20++++++++++++++++=0A=20src/test/regress/expected/privileges.out=20= =20=20=20|=20=2054=20++++-=0A=20= src/test/regress/expected/sanity_check.out=20=20|=20=20=201=20+=0A=20= src/test/regress/parallel_schedule=20=20=20=20=20=20=20=20=20=20|=20=20=20= 2=20+-=0A=20src/test/regress/sql/guc_privs.sql=20=20=20=20=20=20=20=20=20= =20|=20142=20+++++++++++=0A=20src/test/regress/sql/privileges.sql=20=20=20= =20=20=20=20=20=20|=20=2044=20+++-=0A=2042=20files=20changed,=201532=20= insertions(+),=2036=20deletions(-)=0A=20create=20mode=20100644=20= src/backend/catalog/pg_config_param.c=0A=20create=20mode=20100644=20= src/include/catalog/pg_config_param.h=0A=20create=20mode=20100644=20= src/test/regress/expected/guc_privs.out=0A=20create=20mode=20100644=20= src/test/regress/sql/guc_privs.sql=0A=0Adiff=20--git=20= a/doc/src/sgml/catalogs.sgml=20b/doc/src/sgml/catalogs.sgml=0Aindex=20= c1d11be73f..fa085549b8=20100644=0A---=20a/doc/src/sgml/catalogs.sgml=0A= +++=20b/doc/src/sgml/catalogs.sgml=0A@@=20-105,6=20+105,11=20@@=0A=20=20=20= =20=20=20=20collations=20(locale=20information)=0A=20=20=20= =20=20=20=0A=20=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20= pg_config_param=0A+=20=20=20=20=20=20configuration=20parameters=20= which=20have=20privileges=20granted=20to=20roles=0A+=20=20=20=20=20= =0A+=0A=20=20=20=20=20=20=0A=20=20=20=20=20=20=20pg_constraint=0A=20=20=20=20=20=20=20check=20constraints,=20= unique=20constraints,=20primary=20key=20constraints,=20foreign=20key=20= constraints=0A@@=20-2423,6=20+2428,64=20@@=20= SCRAM-SHA-256$<iteration=20= count>:&l=0A=20=20=20=0A=20=20= =0A=20=0A+=20=0A+=20=20= <structname>pg_config_param</structname>=0A+=0A+=20=20= =0A+=20=20=20= pg_config_param=0A+=20=20=0A+=0A+=20=20= =0A+=20=20=20The=20catalog=20= pg_config_param=20records=20configuration=0A+=20= =20=20parameters=20which=20have=20had=20privileges=20to=20= SET=20or=0A+=20=20=20ALTER=20= SYSTEM=20granted=20to=20one=20or=20more=20roles.=0A+=20=20= =0A+=0A+=20=20=0A+=20=20=20Unlike=20most=20system=20= catalogs,=20pg_config_param=0A+=20=20=20is=20= shared=20across=20all=20databases=20of=20a=20cluster:=20there=20is=20= only=20one=0A+=20=20=20copy=20of=20= pg_config_param=20per=20cluster,=20not=0A+=20=20= =20one=20per=20database.=0A+=20=20=0A+=0A+=20=20=0A+=20=20=20= <structname>pg_config_param</structname>=20Columns=0A+=20=20= =20=0A+=20=20=20=20=0A+=20=20=20=20=20=0A= +=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20Column=20Type=0A+=20=20= =20=20=20=20=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20= Description=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =0A+=20=20=20=20=0A+=0A+=20=20=20=20=0A+=20=20=20=20= =20=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20= configname=20text=0A+=20=20=20=20= =20=20=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20The=20= name=20of=20the=20configuration=20parameter=20for=20which=20privileges=20= are=20granted.=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =0A+=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20=0A+=20=20= =20=20=20=20=20cfgacl=20= aclitem[]=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20Access=20privileges;=20see=20=20for=20details=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=0A+=0A+=20=20=20=20=0A+=20= =20=20=0A+=20=20
=0A+=20=0A+=0A=20=20=0A=20=20=20= <structname>pg_constraint</structname>=0A=20=0Adiff=20= --git=20a/doc/src/sgml/ddl.sgml=20b/doc/src/sgml/ddl.sgml=0Aindex=20= 94f745aed0..d862ab8c0e=20100644=0A---=20a/doc/src/sgml/ddl.sgml=0A+++=20= b/doc/src/sgml/ddl.sgml=0A@@=20-1620,7=20+1620,8=20@@=20ALTER=20TABLE=20= products=20RENAME=20TO=20items;=0A=20=20=20=20INSERT,=20= UPDATE,=20DELETE,=0A=20=20=20=20= TRUNCATE,=20REFERENCES,=20= TRIGGER,=0A=20=20=20=20CREATE,=20= CONNECT,=20TEMPORARY,=0A-=20=20=20= EXECUTE,=20and=20USAGE.=0A+=20=20=20= EXECUTE,=20USAGE,=20SET=20= VALUE=0A+=20=20=20and=20ALTER=20SYSTEM.=0A=20= =20=20=20The=20privileges=20applicable=20to=20a=20particular=0A=20=20=20=20= object=20vary=20depending=20on=20the=20object's=20type=20(table,=20= function,=20etc).=0A=20=20=20=20More=20detail=20about=20the=20meanings=20= of=20these=20privileges=20appears=20below.=0A@@=20-1888,6=20+1889,26=20= @@=20REVOKE=20ALL=20ON=20accounts=20FROM=20PUBLIC;=0A=20=20=20=20=20=20=20= =0A=20=20=20=20=20=20=0A=20=20=20=20=20=0A= +=0A+=20=20=20=20=0A+=20=20=20=20=20SET=20= VALUE=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20Allows=20non-superuser=20roles=20to=20use=20= the=20SET=20command=20to=0A+=20=20=20=20=20=20=20= change=20run-time=20configuration=20parameters.=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=0A+=20=20=20=20=0A+=0A= +=20=20=20=20=0A+=20=20=20=20=20ALTER=20= SYSTEM=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20Allows=20non-superuser=20roles=20to=20use=20= the=20ALTER=20SYSTEM=0A+=20=20=20=20=20=20=20SET=20= command=20to=20change=20server=20configuration=20parameters.=0A+=20=20=20= =20=20=20=0A+=20=20=20=20=20=0A+=20=20=20=20= =0A=20=20=20=20=0A=20=0A=20=20=20=20The=20= privileges=20required=20by=20other=20commands=20are=20listed=20on=20the=0A= @@=20-2026,6=20+2047,16=20@@=20REVOKE=20ALL=20ON=20accounts=20FROM=20= PUBLIC;=0A=20=20=20=20=20=20=20=20TYPE=0A=20=20=20=20=20= =20=20=0A=20=20=20=20=20=20
=0A+=20=20=20=20=20=0A+=20=20= =20=20=20=20SET=20VALUE=0A+=20=20=20=20= =20=20s=0A+=20=20=20=20=20=20= configuration=20parameter=0A+=20=20=20=20=20=0A+=20=20= =20=20=20=0A+=20=20=20=20=20=20ALTER=20= SYSTEM=0A+=20=20=20=20=20=20= A=0A+=20=20=20=20=20=20= configuration=20parameter=0A+=20=20=20=20=20=0A=20=20= =20=20=20=20=0A=20=20=20=20=0A=20=20=20=0A@@=20= -2132,6=20+2163,12=20@@=20REVOKE=20ALL=20ON=20accounts=20FROM=20PUBLIC;=0A= =20=20=20=20=20=20=20U=0A=20=20=20=20=20= =20=20\dT+=0A=20=20=20=20=20=20=0A= +=20=20=20=20=20=0A+=20=20=20=20=20=20Configuration=20= parameter=0A+=20=20=20=20=20=20= sA=0A+=20=20=20=20=20=20= none=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=0A=20=20=20=20= =20=0A=20=20=20=20=0A=20=20=20=0Adiff=20--git=20= a/doc/src/sgml/ref/grant.sgml=20b/doc/src/sgml/ref/grant.sgml=0Aindex=20= a897712de2..21ec320a8d=20100644=0A---=20a/doc/src/sgml/ref/grant.sgml=0A= +++=20b/doc/src/sgml/ref/grant.sgml=0A@@=20-92,6=20+92,11=20@@=20GRANT=20= {=20USAGE=20|=20ALL=20[=20PRIVILEGES=20]=20}=0A=20=20=20=20=20TO=20= role_specification=20[,=20= ...]=20[=20WITH=20GRANT=20OPTION=20]=0A=20=20=20=20=20[=20GRANTED=20BY=20= role_specification=20]=0A= =20=0A+GRANT=20{=20SET=20VALUE=20|=20ALTER=20SYSTEM=20}=0A+=20=20=20=20= ON=20configuration_parameter=20[,=20...]=0A= +=20=20=20=20TO=20role_specification=20[,=20...]=20[=20= WITH=20GRANT=20OPTION=20]=0A+=20=20=20=20[=20GRANTED=20BY=20role_specification=20]=0A+=0A=20GRANT=20= role_name=20[,=20...]=20= TO=20role_specification=20= [,=20...]=0A=20=20=20=20=20[=20WITH=20ADMIN=20OPTION=20]=0A=20=20=20=20=20= [=20GRANTED=20BY=20role_specification=20]=0A@@=20-185,6=20= +190,8=20@@=20GRANT=20role_name=20[,=20...]=20TO=20TEMPORARY=0A=20=20=20=20= =20=20EXECUTE=0A=20=20=20=20=20=20= USAGE=0A+=20=20=20=20=20= SET=20VALUE=0A+=20=20=20=20=20= ALTER=20SYSTEM=0A=20=20=20=20=20=20= =0A=20=20=20=20=20=20=20=0A=20=20=20=20=20=20=20=20= Specific=20types=20of=20privileges,=20as=20defined=20in=20.=0Adiff=20--git=20a/doc/src/sgml/ref/set.sgml=20= b/doc/src/sgml/ref/set.sgml=0Aindex=20339ee9eec9..a08057d1d1=20100644=0A= ---=20a/doc/src/sgml/ref/set.sgml=0A+++=20b/doc/src/sgml/ref/set.sgml=0A= @@=20-34,8=20+34,9=20@@=20SET=20[=20SESSION=20|=20LOCAL=20]=20TIME=20= ZONE=20{=20timezone=20can=20be=20changed=20= on-the-fly=20with=0A=20=20=20=20SET.=0A-=20=20=20(But=20= some=20require=20superuser=20privileges=20to=20change,=20and=20others=20= cannot=0A-=20=20=20be=20changed=20after=20server=20or=20session=20= start.)=0A+=20=20=20(But=20some=20require=20either=20superuser=20= privileges=20or=20granted=20SET=0A+=20=20=20VALUE=20= privileges=20to=20change,=20and=20others=20cannot=20be=20changed=20after=0A= +=20=20=20server=20or=20session=20start.)=0A=20=20=20=20= SET=20only=20affects=20the=20value=20used=20by=20the=20= current=0A=20=20=20=20session.=0A=20=20=20=0Adiff=20--git=20= a/src/backend/catalog/Makefile=20b/src/backend/catalog/Makefile=0Aindex=20= 4e6efda97f..bec208db98=20100644=0A---=20a/src/backend/catalog/Makefile=0A= +++=20b/src/backend/catalog/Makefile=0A@@=20-28,6=20+28,7=20@@=20OBJS=20= =3D=20\=0A=20=09pg_cast.o=20\=0A=20=09pg_class.o=20\=0A=20=09= pg_collation.o=20\=0A+=09pg_config_param.o=20\=0A=20=09pg_constraint.o=20= \=0A=20=09pg_conversion.o=20\=0A=20=09pg_db_role_setting.o=20\=0A@@=20= -54,7=20+55,7=20@@=20include=20$(top_srcdir)/src/backend/common.mk=0A=20= #=20there=20are=20reputedly=20other,=20undocumented=20ordering=20= dependencies.=0A=20CATALOG_HEADERS=20:=3D=20\=0A=20=09pg_proc.h=20= pg_type.h=20pg_attribute.h=20pg_class.h=20\=0A-=09pg_attrdef.h=20= pg_constraint.h=20pg_inherits.h=20pg_index.h=20pg_operator.h=20\=0A+=09= pg_attrdef.h=20pg_config_param.h=20pg_constraint.h=20pg_inherits.h=20= pg_index.h=20pg_operator.h=20\=0A=20=09pg_opfamily.h=20pg_opclass.h=20= pg_am.h=20pg_amop.h=20pg_amproc.h=20\=0A=20=09pg_language.h=20= pg_largeobject_metadata.h=20pg_largeobject.h=20pg_aggregate.h=20\=0A=20=09= pg_statistic.h=20pg_statistic_ext.h=20pg_statistic_ext_data.h=20\=0Adiff=20= --git=20a/src/backend/catalog/aclchk.c=20b/src/backend/catalog/aclchk.c=0A= index=20ce0a4ff14e..d309375a31=20100644=0A---=20= a/src/backend/catalog/aclchk.c=0A+++=20b/src/backend/catalog/aclchk.c=0A= @@=20-33,6=20+33,7=20@@=0A=20#include=20"catalog/pg_authid.h"=0A=20= #include=20"catalog/pg_cast.h"=0A=20#include=20"catalog/pg_collation.h"=0A= +#include=20"catalog/pg_config_param.h"=0A=20#include=20= "catalog/pg_conversion.h"=0A=20#include=20"catalog/pg_database.h"=0A=20= #include=20"catalog/pg_default_acl.h"=0A@@=20-112,6=20+113,7=20@@=20= static=20void=20ExecGrant_Largeobject(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Namespace(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Tablespace(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Type(InternalGrant=20*grantStmt);=0A+static=20= void=20ExecGrant_ConfigParam(InternalGrant=20*grantStmt);=0A=20=0A=20= static=20void=20SetDefaultACLsInSchemas(InternalDefaultACL=20*iacls,=20= List=20*nspnames);=0A=20static=20void=20SetDefaultACL(InternalDefaultACL=20= *iacls);=0A@@=20-259,6=20+261,9=20@@=20restrict_and_check_grant(bool=20= is_grant,=20AclMode=20avail_goptions,=20bool=20all_privs,=0A=20=09=09= case=20OBJECT_TYPE:=0A=20=09=09=09whole_mask=20=3D=20= ACL_ALL_RIGHTS_TYPE;=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09whole_mask=20=3D=20= ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09break;=0A=20=09=09default:=0A=20= =09=09=09elog(ERROR,=20"unrecognized=20object=20type:=20%d",=20objtype);=0A= =20=09=09=09/*=20not=20reached,=20but=20keep=20compiler=20quiet=20*/=0A= @@=20-498,6=20+503,10=20@@=20ExecuteGrantStmt(GrantStmt=20*stmt)=0A=20=09= =09=09all_privileges=20=3D=20ACL_ALL_RIGHTS_FOREIGN_SERVER;=0A=20=09=09=09= errormsg=20=3D=20gettext_noop("invalid=20privilege=20type=20%s=20for=20= foreign=20server");=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09all_privileges=20=3D=20= ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09errormsg=20=3D=20= gettext_noop("invalid=20privilege=20type=20%s=20for=20configuration=20= parameter");=0A+=09=09=09break;=0A=20=09=09default:=0A=20=09=09=09= elog(ERROR,=20"unrecognized=20GrantStmt.objtype:=20%d",=0A=20=09=09=09=09= =20(int)=20stmt->objtype);=0A@@=20-600,6=20+609,9=20@@=20= ExecGrantStmt_oids(InternalGrant=20*istmt)=0A=20=09=09case=20= OBJECT_TABLESPACE:=0A=20=09=09=09ExecGrant_Tablespace(istmt);=0A=20=09=09= =09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= ExecGrant_ConfigParam(istmt);=0A+=09=09=09break;=0A=20=09=09default:=0A=20= =09=09=09elog(ERROR,=20"unrecognized=20GrantStmt.objtype:=20%d",=0A=20=09= =09=09=09=20(int)=20istmt->objtype);=0A@@=20-759,6=20+771,38=20@@=20= objectNamesToOids(ObjectType=20objtype,=20List=20*objnames)=0A=20=09=09=09= =09objects=20=3D=20lappend_oid(objects,=20srvid);=0A=20=09=09=09}=0A=20=09= =09=09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= foreach(cell,=20objnames)=0A+=09=09=09{=0A+=09=09=09=09char=09=20=20=20= *cfgname=20=3D=20strVal(lfirst(cell));=0A+=09=09=09=09Oid=09=09=09cfgid=20= =3D=20get_cfgparam_oid(cfgname,=20true);=0A+=0A+=09=09=09=09if=20= (!OidIsValid(cfgid))=0A+=09=09=09=09{=0A+=09=09=09=09=09/*=0A+=09=09=09=09= =09=20*=20Lookup=20the=20existing=20entry,=20or=20if=20necessary,=20add=20= a=20new=0A+=09=09=09=09=09=20*=20entry=20for=20this=20parameter.=20=20= Entries=20only=20exist=20for=0A+=09=09=09=09=09=20*=20parameters=20which=20= currently=20have,=20or=20previously=20have=20had,=0A+=09=09=09=09=09=20*=20= privileges=20assigned.=0A+=09=09=09=09=09=20*=0A+=09=09=09=09=09=20*=20= It=20is=20tempting=20to=20sanity-check=20the=20given=20configuration=0A+=09= =09=09=09=09=20*=20parameter=20name=20against=20known=20guc=20names=20in=20= the=20guc=0A+=09=09=09=09=09=20*=20tables,=20but=20for=20handling=20= upgrades=20we=20need=20to=20accept=0A+=09=09=09=09=09=20*=20= configuration=20parameter=20names=20that=20do=20not=20yet=20exist.=0A+=09= =09=09=09=09=20*/=0A+=09=09=09=09=09cfgid=20=3D=20= ConfigParamCreate(cfgname,=20true);=0A+=0A+=09=09=09=09=09/*=0A+=09=09=09= =09=09=20*=20Prevent=20error=20when=20processing=20duplicate=20objects,=20= and=0A+=09=09=09=09=09=20*=20make=20this=20new=20entry=20visible=20to=20= our=20later=20selves=20which=0A+=09=09=09=09=09=20*=20will=20need=20to=20= update=20the=20Acl.=0A+=09=09=09=09=09=20*/=0A+=09=09=09=09=09= CommandCounterIncrement();=0A+=09=09=09=09}=0A+=0A+=09=09=09=09objects=20= =3D=20lappend_oid(objects,=20cfgid);=0A+=09=09=09}=0A+=09=09=09break;=0A=20= =09=09default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20= GrantStmt.objtype:=20%d",=0A=20=09=09=09=09=20(int)=20objtype);=0A@@=20= -1494,6=20+1538,9=20@@=20RemoveRoleFromObjectACL(Oid=20roleid,=20Oid=20= classid,=20Oid=20objid)=0A=20=09=09=09case=20= ForeignDataWrapperRelationId:=0A=20=09=09=09=09istmt.objtype=20=3D=20= OBJECT_FDW;=0A=20=09=09=09=09break;=0A+=09=09=09case=20= ConfigParamRelationId:=0A+=09=09=09=09istmt.objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09break;=0A=20=09=09=09default:=0A=20=09= =09=09=09elog(ERROR,=20"unexpected=20object=20class=20%u",=20classid);=0A= =20=09=09=09=09break;=0A@@=20-3225,6=20+3272,128=20@@=20= ExecGrant_Type(InternalGrant=20*istmt)=0A=20=09table_close(relation,=20= RowExclusiveLock);=0A=20}=0A=20=0A+static=20void=0A= +ExecGrant_ConfigParam(InternalGrant=20*istmt)=0A+{=0A+=09Relation=09= relation;=0A+=09ListCell=20=20=20*cell;=0A+=0A+=09if=20(istmt->all_privs=20= &&=20istmt->privileges=20=3D=3D=20ACL_NO_RIGHTS)=0A+=09=09= istmt->privileges=20=3D=20ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=0A+=09= relation=20=3D=20table_open(ConfigParamRelationId,=20RowExclusiveLock);=0A= +=0A+=09foreach(cell,=20istmt->objects)=0A+=09{=0A+=09=09Oid=09=09=09= cfgId=20=3D=20lfirst_oid(cell);=0A+=09=09Form_pg_config_param=20= pg_config_param_tuple;=0A+=09=09Datum=09=09aclDatum;=0A+=09=09bool=09=09= isNull;=0A+=09=09AclMode=09=09avail_goptions;=0A+=09=09AclMode=09=09= this_privileges;=0A+=09=09Acl=09=09=20=20=20*old_acl;=0A+=09=09Acl=09=09=20= =20=20*new_acl;=0A+=09=09Oid=09=09=09grantorId;=0A+=09=09HeapTuple=09= tuple;=0A+=09=09HeapTuple=09newtuple;=0A+=09=09Datum=09=09= values[Natts_pg_config_param];=0A+=09=09bool=09=09= nulls[Natts_pg_config_param];=0A+=09=09bool=09=09= replaces[Natts_pg_config_param];=0A+=09=09int=09=09=09noldmembers;=0A+=09= =09int=09=09=09nnewmembers;=0A+=09=09Oid=09=09=20=20=20*oldmembers;=0A+=09= =09Oid=09=09=20=20=20*newmembers;=0A+=0A+=09=09tuple=20=3D=20= SearchSysCache1(CONFIGOID,=20ObjectIdGetDatum(cfgId));=0A+=09=09if=20= (!HeapTupleIsValid(tuple))=0A+=09=09=09elog(ERROR,=20"cache=20lookup=20= failed=20for=20configuration=20parameter=20%u",=20cfgId);=0A+=0A+=09=09= pg_config_param_tuple=20=3D=20(Form_pg_config_param)=20GETSTRUCT(tuple);=0A= +=0A+=09=09/*=0A+=09=09=20*=20Get=20owner=20ID=20and=20working=20copy=20= of=20existing=20ACL.=20If=20there's=20no=20ACL,=0A+=09=09=20*=20= substitute=20the=20proper=20default.=0A+=09=09=20*/=0A+=09=09aclDatum=20= =3D=20SysCacheGetAttr(CONFIGNAME,=20tuple,=20= Anum_pg_config_param_cfgacl,=0A+=09=09=09=09=09=09=09=09=20=20=20= &isNull);=0A+=09=09if=20(isNull)=0A+=09=09{=0A+=09=09=09old_acl=20=3D=20= acldefault(OBJECT_CONFIG_PARAM,=20InvalidOid);=0A+=09=09=09/*=20There=20= are=20no=20old=20member=20roles=20according=20to=20the=20catalogs=20*/=0A= +=09=09=09noldmembers=20=3D=200;=0A+=09=09=09oldmembers=20=3D=20NULL;=0A= +=09=09}=0A+=09=09else=0A+=09=09{=0A+=09=09=09old_acl=20=3D=20= DatumGetAclPCopy(aclDatum);=0A+=09=09=09/*=20Get=20the=20roles=20= mentioned=20in=20the=20existing=20ACL=20*/=0A+=09=09=09noldmembers=20=3D=20= aclmembers(old_acl,=20&oldmembers);=0A+=09=09}=0A+=0A+=09=09/*=20= Determine=20ID=20to=20do=20the=20grant=20as,=20and=20available=20grant=20= options=20*/=0A+=09=09select_best_grantor(GetUserId(),=20= istmt->privileges,=0A+=09=09=09=09=09=09=09old_acl,=20GetUserId(),=0A+=09= =09=09=09=09=09=09&grantorId,=20&avail_goptions);=0A+=0A+=09=09/*=0A+=09=09= =20*=20Restrict=20the=20privileges=20to=20what=20we=20can=20actually=20= grant,=20and=20emit=20the=0A+=09=09=20*=20standards-mandated=20warning=20= and=20error=20messages.=0A+=09=09=20*/=0A+=09=09this_privileges=20=3D=0A= +=09=09=09restrict_and_check_grant(istmt->is_grant,=20avail_goptions,=0A= +=09=09=09=09=09=09=09=09=09=20istmt->all_privs,=20istmt->privileges,=0A= +=09=09=09=09=09=09=09=09=09=20cfgId,=20grantorId,=20= OBJECT_CONFIG_PARAM,=0A+=09=09=09=09=09=09=09=09=09=20= text_to_cstring(&pg_config_param_tuple->configname),=0A+=09=09=09=09=09=09= =09=09=09=200,=20NULL);=0A+=0A+=09=09/*=0A+=09=09=20*=20Generate=20new=20= ACL.=0A+=09=09=20*/=0A+=09=09new_acl=20=3D=20= merge_acl_with_grant(old_acl,=20istmt->is_grant,=0A+=09=09=09=09=09=09=09= =09=09=20=20=20istmt->grant_option,=20istmt->behavior,=0A+=09=09=09=09=09= =09=09=09=09=20=20=20istmt->grantees,=20this_privileges,=0A+=09=09=09=09=09= =09=09=09=09=20=20=20grantorId,=20InvalidOid);=0A+=0A+=09=09/*=0A+=09=09=20= *=20We=20need=20the=20members=20of=20both=20old=20and=20new=20ACLs=20so=20= we=20can=20correct=20the=0A+=09=09=20*=20shared=20dependency=20= information.=0A+=09=09=20*/=0A+=09=09nnewmembers=20=3D=20= aclmembers(new_acl,=20&newmembers);=0A+=0A+=09=09/*=20finished=20= building=20new=20ACL=20value,=20now=20insert=20it=20*/=0A+=09=09= MemSet(values,=200,=20sizeof(values));=0A+=09=09MemSet(nulls,=20false,=20= sizeof(nulls));=0A+=09=09MemSet(replaces,=20false,=20sizeof(replaces));=0A= +=0A+=09=09replaces[Anum_pg_config_param_cfgacl=20-=201]=20=3D=20true;=0A= +=09=09values[Anum_pg_config_param_cfgacl=20-=201]=20=3D=20= PointerGetDatum(new_acl);=0A+=0A+=09=09newtuple=20=3D=20= heap_modify_tuple(tuple,=20RelationGetDescr(relation),=20values,=0A+=09=09= =09=09=09=09=09=09=09=20nulls,=20replaces);=0A+=0A+=09=09= CatalogTupleUpdate(relation,=20&newtuple->t_self,=20newtuple);=0A+=0A+=09= =09/*=20Update=20initial=20privileges=20for=20extensions=20*/=0A+=09=09= recordExtensionInitPriv(cfgId,=20ConfigParamRelationId,=200,=20new_acl);=0A= +=0A+=09=09/*=20Update=20the=20shared=20dependency=20ACL=20info=20*/=0A+=09= =09updateAclDependencies(ConfigParamRelationId,=0A+=09=09=09=09=09=09=09=20= =20pg_config_param_tuple->oid,=200,=0A+=09=09=09=09=09=09=09=20=20= InvalidOid,=0A+=09=09=09=09=09=09=09=20=20noldmembers,=20oldmembers,=0A+=09= =09=09=09=09=09=09=20=20nnewmembers,=20newmembers);=0A+=0A+=09=09= ReleaseSysCache(tuple);=0A+=0A+=09=09pfree(new_acl);=0A+=0A+=09=09/*=20= prevent=20error=20when=20processing=20duplicate=20objects=20*/=0A+=09=09= CommandCounterIncrement();=0A+=09}=0A+=0A+=09table_close(relation,=20= RowExclusiveLock);=0A+}=0A+=0A=20=0A=20static=20AclMode=0A=20= string_to_privilege(const=20char=20*privname)=0A@@=20-3255,6=20+3424,10=20= @@=20string_to_privilege(const=20char=20*privname)=0A=20=09=09return=20= ACL_CREATE_TEMP;=0A=20=09if=20(strcmp(privname,=20"connect")=20=3D=3D=20= 0)=0A=20=09=09return=20ACL_CONNECT;=0A+=09if=20(strcmp(privname,=20"set=20= value")=20=3D=3D=200)=0A+=09=09return=20ACL_SET;=0A+=09if=20= (strcmp(privname,=20"alter=20system")=20=3D=3D=200)=0A+=09=09return=20= ACL_ALTER_SYSTEM;=0A=20=09if=20(strcmp(privname,=20"rule")=20=3D=3D=200)=0A= =20=09=09return=200;=09=09=09=09/*=20ignore=20old=20RULE=20privileges=20= */=0A=20=09ereport(ERROR,=0A@@=20-3292,6=20+3465,10=20@@=20= privilege_to_string(AclMode=20privilege)=0A=20=09=09=09return=20"TEMP";=0A= =20=09=09case=20ACL_CONNECT:=0A=20=09=09=09return=20"CONNECT";=0A+=09=09= case=20ACL_SET:=0A+=09=09=09return=20"SET=20VALUE";=0A+=09=09case=20= ACL_ALTER_SYSTEM:=0A+=09=09=09return=20"ALTER=20SYSTEM";=0A=20=09=09= default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20privilege:=20%d",=20= (int)=20privilege);=0A=20=09}=0A@@=20-3328,6=20+3505,13=20@@=20= aclcheck_error(AclResult=20aclerr,=20ObjectType=20objtype,=0A=20=09=09=09= =09=09case=20OBJECT_COLUMN:=0A=20=09=09=09=09=09=09msg=20=3D=20= gettext_noop("permission=20denied=20for=20column=20%s");=0A=20=09=09=09=09= =09=09break;=0A+=09=09=09=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09=09= =09=09/*=0A+=09=09=09=09=09=09=20*=20Quote=20the=20object=20name=20for=20= backward=20compatibility=0A+=09=09=09=09=09=09=20*=20with=20behavior=20= before=20SET=20was=20handled=20here.=0A+=09=09=09=09=09=09=20*/=0A+=09=09= =09=09=09=09msg=20=3D=20gettext_noop("permission=20denied=20to=20set=20= parameter=20\"%s\"");=0A+=09=09=09=09=09=09break;=0A=20=09=09=09=09=09= case=20OBJECT_CONVERSION:=0A=20=09=09=09=09=09=09msg=20=3D=20= gettext_noop("permission=20denied=20for=20conversion=20%s");=0A=20=09=09=09= =09=09=09break;=0A@@=20-3564,6=20+3748,7=20@@=20aclcheck_error(AclResult=20= aclerr,=20ObjectType=20objtype,=0A=20=09=09=09=09=09case=20= OBJECT_AMPROC:=0A=20=09=09=09=09=09case=20OBJECT_ATTRIBUTE:=0A=20=09=09=09= =09=09case=20OBJECT_CAST:=0A+=09=09=09=09=09case=20OBJECT_CONFIG_PARAM:=0A= =20=09=09=09=09=09case=20OBJECT_DEFAULT:=0A=20=09=09=09=09=09case=20= OBJECT_DEFACL:=0A=20=09=09=09=09=09case=20OBJECT_DOMCONSTRAINT:=0A@@=20= -4000,6=20+4185,59=20@@=20pg_database_aclmask(Oid=20db_oid,=20Oid=20= roleid,=0A=20=09return=20result;=0A=20}=0A=20=0A+/*=0A+=20*=20Exported=20= routine=20for=20examining=20a=20user's=20privileges=20for=20a=20= configuration=0A+=20*=20parameter=20(GUC)=0A+=20*/=0A+AclMode=0A= +pg_config_param_aclmask(Oid=20config_oid,=20Oid=20roleid,=0A+=09=09=09=09= =09=09AclMode=20mask,=20AclMaskHow=20how)=0A+{=0A+=09AclMode=09=09= result;=0A+=09HeapTuple=09tuple;=0A+=09Datum=09=09aclDatum;=0A+=09bool=09= =09isNull;=0A+=09Acl=09=09=20=20=20*acl;=0A+=0A+=09/*=20Superusers=20= bypass=20all=20permission=20checking.=20*/=0A+=09if=20= (superuser_arg(roleid))=0A+=09=09return=20mask;=0A+=0A+=09/*=0A+=09=20*=20= Get=20the=20configuration=20parameter's=20ACL=20from=20pg_config_param=0A= +=09=20*/=0A+=09tuple=20=3D=20SearchSysCache1(CONFIGOID,=20= ObjectIdGetDatum(config_oid));=0A+=09if=20(!HeapTupleIsValid(tuple))=0A+=09= =09ereport(ERROR,=0A+=09=09=09=09(errcode(ERRCODE_UNDEFINED_DATABASE),=0A= +=09=09=09=09=20errmsg("configuration=20parameter=20with=20OID=20%u=20= does=20not=20exist",=0A+=09=09=09=09=09=09config_oid)));=0A+=0A+=09= aclDatum=20=3D=20SysCacheGetAttr(CONFIGOID,=20tuple,=20= Anum_pg_config_param_cfgacl,=0A+=09=09=09=09=09=09=09=20=20=20&isNull);=0A= +=09if=20(isNull)=0A+=09{=0A+=09=09/*=20No=20ACL,=20so=20build=20default=20= ACL=20*/=0A+=09=09acl=20=3D=20acldefault(OBJECT_CONFIG_PARAM,=20= InvalidOid);=0A+=09=09aclDatum=20=3D=20(Datum)=200;=0A+=09}=0A+=09else=0A= +=09{=0A+=09=09/*=20detoast=20ACL=20if=20necessary=20*/=0A+=09=09acl=20=3D= =20DatumGetAclP(aclDatum);=0A+=09}=0A+=0A+=09result=20=3D=20aclmask(acl,=20= roleid,=20InvalidOid,=20mask,=20how);=0A+=0A+=09/*=20if=20we=20have=20a=20= detoasted=20copy,=20free=20it=20*/=0A+=09if=20(acl=20&&=20(Pointer)=20= acl=20!=3D=20DatumGetPointer(aclDatum))=0A+=09=09pfree(acl);=0A+=0A+=09= ReleaseSysCache(tuple);=0A+=0A+=09return=20result;=0A+}=0A+=0A=20/*=0A=20= =20*=20Exported=20routine=20for=20examining=20a=20user's=20privileges=20= for=20a=20function=0A=20=20*/=0A@@=20-4713,6=20+4951,19=20@@=20= pg_database_aclcheck(Oid=20db_oid,=20Oid=20roleid,=20AclMode=20mode)=0A=20= =09=09return=20ACLCHECK_NO_PRIV;=0A=20}=0A=20=0A+/*=0A+=20*=20Exported=20= routine=20for=20checking=20a=20user's=20access=20privileges=20to=20a=20= configuration=0A+=20*=20parameter=0A+=20*/=0A+AclResult=0A= +pg_config_param_aclcheck(Oid=20config_oid,=20Oid=20roleid,=20AclMode=20= mode)=0A+{=0A+=09if=20(pg_config_param_aclmask(config_oid,=20roleid,=20= mode,=20ACLMASK_ANY)=20!=3D=200)=0A+=09=09return=20ACLCHECK_OK;=0A+=09= else=0A+=09=09return=20ACLCHECK_NO_PRIV;=0A+}=0A+=0A=20/*=0A=20=20*=20= Exported=20routine=20for=20checking=20a=20user's=20access=20privileges=20= to=20a=20function=0A=20=20*/=0Adiff=20--git=20= a/src/backend/catalog/catalog.c=20b/src/backend/catalog/catalog.c=0A= index=20aa7d4d5456..578bac485c=20100644=0A---=20= a/src/backend/catalog/catalog.c=0A+++=20b/src/backend/catalog/catalog.c=0A= @@=20-29,6=20+29,7=20@@=0A=20#include=20"catalog/namespace.h"=0A=20= #include=20"catalog/pg_auth_members.h"=0A=20#include=20= "catalog/pg_authid.h"=0A+#include=20"catalog/pg_config_param.h"=0A=20= #include=20"catalog/pg_database.h"=0A=20#include=20= "catalog/pg_db_role_setting.h"=0A=20#include=20= "catalog/pg_largeobject.h"=0A@@=20-246,6=20+247,7=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09/*=20These=20are=20the=20= shared=20catalogs=20(look=20for=20BKI_SHARED_RELATION)=20*/=0A=20=09if=20= (relationId=20=3D=3D=20AuthIdRelationId=20||=0A=20=09=09relationId=20=3D=3D= =20AuthMemRelationId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDescriptionRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDependRelationId=20||=0A@@=20-260,6=20+262,8=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09=09relationId=20=3D=3D=20= AuthIdOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= AuthMemRoleMemIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= AuthMemMemRoleIndexId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamNameIndexId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseNameIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDescriptionObjIndexId=20||=0A@@=20-277,6=20+281,8=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09/*=20These=20are=20their=20= toast=20tables=20and=20toast=20indexes=20*/=0A=20=09if=20(relationId=20= =3D=3D=20PgAuthidToastTable=20||=0A=20=09=09relationId=20=3D=3D=20= PgAuthidToastIndex=20||=0A+=09=09relationId=20=3D=3D=20= PgConfigParamToastTable=20||=0A+=09=09relationId=20=3D=3D=20= PgConfigParamToastIndex=20||=0A=20=09=09relationId=20=3D=3D=20= PgDatabaseToastTable=20||=0A=20=09=09relationId=20=3D=3D=20= PgDatabaseToastIndex=20||=0A=20=09=09relationId=20=3D=3D=20= PgDbRoleSettingToastTable=20||=0Adiff=20--git=20= a/src/backend/catalog/dependency.c=20b/src/backend/catalog/dependency.c=0A= index=20fe9c714257..65cf4fbd0b=20100644=0A---=20= a/src/backend/catalog/dependency.c=0A+++=20= b/src/backend/catalog/dependency.c=0A@@=20-30,6=20+30,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-150,6=20+151,7=20@@=20static=20const=20= Oid=20object_classes[]=20=3D=20{=0A=20=09TypeRelationId,=09=09=09=09/*=20= OCLASS_TYPE=20*/=0A=20=09CastRelationId,=09=09=09=09/*=20OCLASS_CAST=20= */=0A=20=09CollationRelationId,=09=09/*=20OCLASS_COLLATION=20*/=0A+=09= ConfigParamRelationId,=09=09/*=20OCLASS_CONFIG_PARAM=20*/=0A=20=09= ConstraintRelationId,=09=09/*=20OCLASS_CONSTRAINT=20*/=0A=20=09= ConversionRelationId,=09=09/*=20OCLASS_CONVERSION=20*/=0A=20=09= AttrDefaultRelationId,=09=09/*=20OCLASS_DEFAULT=20*/=0A@@=20-1504,6=20= +1506,7=20@@=20doDeletion(const=20ObjectAddress=20*object,=20int=20= flags)=0A=20=09=09=09/*=0A=20=09=09=09=20*=20These=20global=20object=20= types=20are=20not=20supported=20here.=0A=20=09=09=09=20*/=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A=20=09=09case=20OCLASS_ROLE:=0A=20=09=09case=20= OCLASS_DATABASE:=0A=20=09=09case=20OCLASS_TBLSPACE:=0A@@=20-2778,6=20= +2781,9=20@@=20getObjectClass(const=20ObjectAddress=20*object)=0A=20=09=09= case=20CollationRelationId:=0A=20=09=09=09return=20OCLASS_COLLATION;=0A=20= =0A+=09=09case=20ConfigParamRelationId:=0A+=09=09=09return=20= OCLASS_CONFIG_PARAM;=0A+=0A=20=09=09case=20ConstraintRelationId:=0A=20=09= =09=09return=20OCLASS_CONSTRAINT;=0A=20=0Adiff=20--git=20= a/src/backend/catalog/information_schema.sql=20= b/src/backend/catalog/information_schema.sql=0Aindex=20= 11d9dd60c2..38dd62c398=20100644=0A---=20= a/src/backend/catalog/information_schema.sql=0A+++=20= b/src/backend/catalog/information_schema.sql=0A@@=20-2429,6=20+2429,25=20= @@=20CREATE=20VIEW=20usage_privileges=20AS=0A=20GRANT=20SELECT=20ON=20= usage_privileges=20TO=20PUBLIC;=0A=20=0A=20=0A+/*=0A+=20*=20= GUC_PRIVILEGES=20view=0A+=20*/=0A+CREATE=20VIEW=20guc_privileges=20AS=0A= +=09SELECT=20CAST(grantor.rolname=20AS=20sql_identifier)=20AS=20grantor,=0A= +=09=09=20=20=20CAST(grantee.rolname=20AS=20sql_identifier)=20aS=20= grantee,=0A+=09=09=20=20=20CAST(cfg.configname=20AS=20character_data)=20= AS=20guc,=0A+=09=09=20=20=20CAST(acl.privilege_type=20AS=20= character_data)=20AS=20privilege_type,=0A+=09=09=20=20=20CAST(CASE=20= WHEN=20acl.is_grantable=20THEN=20'YES'=20ELSE=20'NO'=20END=20AS=20= yes_or_no)=20AS=20is_grantable=0A+=09=09FROM=20= pg_catalog.pg_config_param=20cfg,=0A+=09=09LATERAL=20(SELECT=20*=20FROM=20= aclexplode(cfg.cfgacl))=20acl=0A+=09=09JOIN=20pg_catalog.pg_authid=20= grantee=0A+=09=09ON=20acl.grantee=20=3D=20grantee.oid=0A+=09=09LEFT=20= JOIN=20pg_catalog.pg_authid=20grantor=20ON=20acl.grantor=20=3D=20= grantor.oid;=0A+=09=09--=20WHERE=20acl.grantee=20>=200;=0A+=0A+GRANT=20= SELECT=20ON=20guc_privileges=20TO=20PUBLIC;=0A+=0A+=0A=20/*=0A=20=20*=20= 5.45=0A=20=20*=20ROLE_USAGE_GRANTS=20view=0Adiff=20--git=20= a/src/backend/catalog/objectaddress.c=20= b/src/backend/catalog/objectaddress.c=0Aindex=202bae3fbb17..7355c7403d=20= 100644=0A---=20a/src/backend/catalog/objectaddress.c=0A+++=20= b/src/backend/catalog/objectaddress.c=0A@@=20-29,6=20+29,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-2309,6=20+2310,7=20@@=20= pg_get_object_address(PG_FUNCTION_ARGS)=0A=20=09=09case=20OBJECT_COLUMN:=0A= =20=09=09case=20OBJECT_ATTRIBUTE:=0A=20=09=09case=20OBJECT_COLLATION:=0A= +=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09=09case=20OBJECT_CONVERSION:=0A= =20=09=09case=20OBJECT_STATISTIC_EXT:=0A=20=09=09case=20OBJECT_TSPARSER:=0A= @@=20-3510,6=20+3512,22=20@@=20getObjectDescription(const=20= ObjectAddress=20*object,=20bool=20missing_ok)=0A=20=09=09=09=09break;=0A=20= =09=09=09}=0A=20=0A+=09=09case=20OCLASS_CONFIG_PARAM:=0A+=09=09=09{=0A+=09= =09=09=09char=09=20=20=20*configname;=0A+=0A+=09=09=09=09configname=20=3D=20= get_cfgparam_name(object->objectId);=0A+=09=09=09=09if=20(!configname)=0A= +=09=09=09=09{=0A+=09=09=09=09=09if=20(!missing_ok)=0A+=09=09=09=09=09=09= elog(ERROR,=20"cache=20lookup=20failed=20for=20configuration=20parameter=20= %u",=0A+=09=09=09=09=09=09=09=20object->objectId);=0A+=09=09=09=09=09= break;=0A+=09=09=09=09}=0A+=09=09=09=09appendStringInfo(&buffer,=20= _("configuration=20parameter=20%s"),=20configname);=0A+=09=09=09=09= break;=0A+=09=09=09}=0A+=0A=20=09=09case=20OCLASS_SCHEMA:=0A=20=09=09=09= {=0A=20=09=09=09=09char=09=20=20=20*nspname;=0A@@=20-4473,6=20+4491,10=20= @@=20getObjectTypeDescription(const=20ObjectAddress=20*object,=20bool=20= missing_ok)=0A=20=09=09=09appendStringInfoString(&buffer,=20= "collation");=0A=20=09=09=09break;=0A=20=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A+=09=09=09appendStringInfoString(&buffer,=20= "configuration=20parameter");=0A+=09=09=09break;=0A+=0A=20=09=09case=20= OCLASS_CONSTRAINT:=0A=20=09=09=09getConstraintTypeDescription(&buffer,=20= object->objectId,=0A=20=09=09=09=09=09=09=09=09=09=09=20missing_ok);=0A= @@=20-4977,6=20+4999,30=20@@=20getObjectIdentityParts(const=20= ObjectAddress=20*object,=0A=20=09=09=09=09break;=0A=20=09=09=09}=0A=20=0A= +=09=09case=20OCLASS_CONFIG_PARAM:=0A+=09=09=09{=0A+=09=09=09=09= HeapTuple=09configTup;=0A+=09=09=09=09Form_pg_config_param=20configForm;=0A= +=09=09=09=09char=09=20=20=20*namestr;=0A+=0A+=09=09=09=09configTup=20=3D=20= SearchSysCache1(CONFIGOID,=0A+=09=09=09=09=09=09=09=09=09=09=09= ObjectIdGetDatum(object->objectId));=0A+=09=09=09=09if=20= (!HeapTupleIsValid(configTup))=0A+=09=09=09=09{=0A+=09=09=09=09=09if=20= (!missing_ok)=0A+=09=09=09=09=09=09elog(ERROR,=20"cache=20lookup=20= failed=20for=20configuration=20parameter=20%u",=0A+=09=09=09=09=09=09=09=20= object->objectId);=0A+=09=09=09=09=09break;=0A+=09=09=09=09}=0A+=09=09=09= =09configForm=20=3D=20(Form_pg_config_param)=20GETSTRUCT(configTup);=0A+=09= =09=09=09namestr=20=3D=20text_to_cstring(&configForm->configname);=0A+=09= =09=09=09appendStringInfoString(&buffer,=20namestr);=0A+=09=09=09=09if=20= (objname)=0A+=09=09=09=09=09*objname=20=3D=20list_make1(namestr);=0A+=09=09= =09=09ReleaseSysCache(configTup);=0A+=09=09=09=09break;=0A+=09=09=09}=0A= +=0A=20=09=09case=20OCLASS_CONVERSION:=0A=20=09=09=09{=0A=20=09=09=09=09= HeapTuple=09conTup;=0Adiff=20--git=20= a/src/backend/catalog/pg_config_param.c=20= b/src/backend/catalog/pg_config_param.c=0Anew=20file=20mode=20100644=0A= index=200000000000..f71de8aa25=0A---=20/dev/null=0A+++=20= b/src/backend/catalog/pg_config_param.c=0A@@=20-0,0=20+1,126=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_config_param.c=0A+=20*=09=20=20routines=20to=20= support=20manipulation=20of=20the=20pg_config_param=20relation=0A+=20*=0A= +=20*=20Portions=20Copyright=20(c)=201996-2021,=20PostgreSQL=20Global=20= Development=20Group=0A+=20*=20Portions=20Copyright=20(c)=201994,=20= Regents=20of=20the=20University=20of=20California=0A+=20*=0A+=20*=0A+=20= *=20IDENTIFICATION=0A+=20*=09=20=20src/backend/catalog/pg_config_param.c=0A= +=20*=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#include=20"postgres.h"=0A+=0A+#include=20"access/genam.h"=0A= +#include=20"access/heapam.h"=0A+#include=20"access/htup_details.h"=0A= +#include=20"access/sysattr.h"=0A+#include=20"access/table.h"=0A= +#include=20"access/tableam.h"=0A+#include=20"catalog/catalog.h"=0A= +#include=20"catalog/dependency.h"=0A+#include=20"catalog/indexing.h"=0A= +#include=20"catalog/objectaccess.h"=0A+#include=20= "catalog/pg_config_param.h"=0A+#include=20"catalog/pg_namespace.h"=0A= +#include=20"mb/pg_wchar.h"=0A+#include=20"utils/builtins.h"=0A+#include=20= "utils/fmgroids.h"=0A+#include=20"utils/guc.h"=0A+#include=20= "utils/pg_locale.h"=0A+#include=20"utils/rel.h"=0A+#include=20= "utils/syscache.h"=0A+=0A+=0A+/*=0A+=20*=20ConfigParamCreate=0A+=20*=0A+=20= *=20Add=20a=20new=20tuple=20to=20pg_config_param.=0A+=20*=0A+=20*=20= configname:=20the=20configuration=20parameter=20name=20to=20create.=0A+=20= *=20if_not_exists:=20if=20true,=20don't=20fail=20on=20duplicate=20name,=20= but=20rather=20return=0A+=20*=20the=20existing=20entry's=20Oid.=0A+=20*/=0A= +Oid=0A+ConfigParamCreate(const=20char=20*configname,=20bool=20= if_not_exists)=0A+{=0A+=09Relation=09rel;=0A+=09TupleDesc=09tupDesc;=0A+=09= HeapTuple=09tuple;=0A+=09Datum=09=09values[Natts_pg_config_param];=0A+=09= bool=09=09nulls[Natts_pg_config_param];=0A+=09Oid=09=09=09configParamId;=0A= +=09const=20char=20*canonical;=0A+=0A+=09/*=0A+=09=20*=20Check=20whether=20= the=20configuration=20parameter=20(by=20the=20given=20name=20or=20alias)=0A= +=09=20*=20already=20exists.=0A+=09=20*/=0A+=09configParamId=20=3D=20= get_cfgparam_oid(configname,=20true);=0A+=09if=20= (OidIsValid(configParamId))=0A+=09{=0A+=09=09if=20(if_not_exists)=0A+=09=09= =09return=20configParamId;=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_DUPLICATE_OBJECT),=0A+=09=09=09=09=20= errmsg("configuration=20parameter=20\"%s\"=20already=20exists",=0A+=09=09= =09=09=09=09configname)));=0A+=09}=0A+=0A+=09/*=0A+=09=20*=20We=20must=20= not=20require=20the=20configname=20to=20be=20in=20the=20list=20of=20= existent=20GUCs,=0A+=09=20*=20as=20we=20may=20be=20called=20at=20= different=20points=20during=20upgrades=20or=20the=0A+=09=20*=20= installation=20or=20removal=20of=20extensions.=20=20Instead,=20perform=20= a=20basic=20sanity=0A+=09=20*=20check=20of=20the=20configname,=20and=20= translate=20old=20forms=20of=20known=20names=20to=20their=0A+=09=20*=20= canonical=20forms.=0A+=09=20*=0A+=09=20*=20If=20you=20deprecate=20a=20= configuration=20name=20in=20favor=20of=20a=20new=20spelling,=20be=0A+=09=20= *=20sure=20to=20consider=20whether=20to=20also=20upgrade=20= pg_config_param=20entries.=0A+=09=20*/=0A+=09if=20= (!valid_variable_name(configname,=20NULL))=0A+=09=09ereport(ERROR,=0A+=09= =09=09=09(errcode(ERRCODE_INVALID_NAME),=0A+=09=09=09=09=20= errmsg("invalid=20configuration=20parameter=20name=20\"%s\"",=0A+=09=09=09= =09=09=09configname)));=0A+=09canonical=20=3D=20= GetConfigOptionCanonicalName(configname);=0A+=09if=20(!canonical)=0A+=09=09= canonical=20=3D=20configname;=0A+=09else=20if=20(strcmp(canonical,=20= configname)=20!=3D=200)=0A+=09=09ereport(NOTICE,=0A+=09=09=09=09= (errcode(ERRCODE_INVALID_NAME),=0A+=09=09=09=09=20errmsg("granting=20= privileges=20on=20canonical=20configuration=20parameter=20name=20= \"%s\"",=20canonical)));=0A+=0A+=09/*=0A+=09=20*=20Create=20and=20insert=20= a=20new=20record,=20starting=20with=20a=20blank=20Acl.=0A+=09=20*=0A+=09=20= *=20We=20don't=20take=20a=20strong=20enough=20lock=20to=20prevent=20= concurrent=20insertions,=0A+=09=20*=20relying=20instead=20on=20the=20= unique=20index.=0A+=09=20*/=0A+=09rel=20=3D=20= table_open(ConfigParamRelationId,=20RowExclusiveLock);=0A+=09tupDesc=20=3D= =20RelationGetDescr(rel);=0A+=09MemSet(values,=200,=20sizeof(values));=0A= +=09MemSet(nulls,=20false,=20sizeof(nulls));=0A+=09= values[Anum_pg_config_param_configname=20-=201]=20=3D=0A+=09=09= DirectFunctionCall1(textin,=20CStringGetDatum(canonical));=0A+=09= configParamId=20=3D=20GetNewOidWithIndex(rel,=0A+=09=09=09=09=09=09=09=09= =09=20=20=20ConfigParamOidIndexId,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= Anum_pg_config_param_oid);=0A+=09values[Anum_pg_config_param_oid=20-=20= 1]=20=3D=20ObjectIdGetDatum(configParamId);=0A+=09= nulls[Anum_pg_config_param_cfgacl=20-=201]=20=3D=20true;=0A+=09tuple=20=3D= =20heap_form_tuple(tupDesc,=20values,=20nulls);=0A+=09= CatalogTupleInsert(rel,=20tuple);=0A+=0A+=09/*=20Post=20creation=20hook=20= for=20new=20configuration=20parameter=20*/=0A+=09= InvokeObjectPostCreateHook(ConfigParamRelationId,=20configParamId,=200);=0A= +=0A+=09/*=0A+=09=20*=20Close=20pg_config_param,=20but=20keep=20lock=20= till=20commit.=0A+=09=20*/=0A+=09heap_freetuple(tuple);=0A+=09= table_close(rel,=20NoLock);=0A+=0A+=09return=20configParamId;=0A+}=0A= diff=20--git=20a/src/backend/commands/alter.c=20= b/src/backend/commands/alter.c=0Aindex=2040044070cf..1f8c3f78c2=20100644=0A= ---=20a/src/backend/commands/alter.c=0A+++=20= b/src/backend/commands/alter.c=0A@@=20-639,6=20+639,7=20@@=20= AlterObjectNamespace_oid(Oid=20classId,=20Oid=20objid,=20Oid=20nspOid,=0A= =20=09=09=09break;=0A=20=0A=20=09=09case=20OCLASS_CAST:=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A=20=09=09case=20OCLASS_CONSTRAINT:=0A=20=09=09= case=20OCLASS_DEFAULT:=0A=20=09=09case=20OCLASS_LANGUAGE:=0Adiff=20--git=20= a/src/backend/commands/dropcmds.c=20b/src/backend/commands/dropcmds.c=0A= index=204e545adf95..cd98976e07=20100644=0A---=20= a/src/backend/commands/dropcmds.c=0A+++=20= b/src/backend/commands/dropcmds.c=0A@@=20-276,6=20+276,13=20@@=20= does_not_exist_skipping(ObjectType=20objtype,=20Node=20*object)=0A=20=09=09= =09=09name=20=3D=20NameListToString(castNode(List,=20object));=0A=20=09=09= =09}=0A=20=09=09=09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= if=20(!schema_does_not_exist_skipping(castNode(List,=20object),=20&msg,=20= &name))=0A+=09=09=09{=0A+=09=09=09=09msg=20=3D=20= gettext_noop("configuration=20parameter=20\"%s\"=20does=20not=20exist,=20= skipping");=0A+=09=09=09=09name=20=3D=20NameListToString(castNode(List,=20= object));=0A+=09=09=09}=0A+=09=09=09break;=0A=20=09=09case=20= OBJECT_CONVERSION:=0A=20=09=09=09if=20= (!schema_does_not_exist_skipping(castNode(List,=20object),=20&msg,=20= &name))=0A=20=09=09=09{=0Adiff=20--git=20= a/src/backend/commands/event_trigger.c=20= b/src/backend/commands/event_trigger.c=0Aindex=20df264329d8..419a7a4fad=20= 100644=0A---=20a/src/backend/commands/event_trigger.c=0A+++=20= b/src/backend/commands/event_trigger.c=0A@@=20-937,6=20+937,7=20@@=20= EventTriggerSupportsObjectType(ObjectType=20obtype)=0A=20{=0A=20=09= switch=20(obtype)=0A=20=09{=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09= =09case=20OBJECT_DATABASE:=0A=20=09=09case=20OBJECT_TABLESPACE:=0A=20=09=09= case=20OBJECT_ROLE:=0A@@=20-1012,6=20+1013,7=20@@=20= EventTriggerSupportsObjectClass(ObjectClass=20objclass)=0A=20{=0A=20=09= switch=20(objclass)=0A=20=09{=0A+=09=09case=20OCLASS_CONFIG_PARAM:=0A=20=09= =09case=20OCLASS_DATABASE:=0A=20=09=09case=20OCLASS_TBLSPACE:=0A=20=09=09= case=20OCLASS_ROLE:=0A@@=20-2078,6=20+2080,8=20@@=20= stringify_grant_objtype(ObjectType=20objtype)=0A=20=09{=0A=20=09=09case=20= OBJECT_COLUMN:=0A=20=09=09=09return=20"COLUMN";=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09return=20"CONFIGURATION=20PARAMETER";=0A= =20=09=09case=20OBJECT_TABLE:=0A=20=09=09=09return=20"TABLE";=0A=20=09=09= case=20OBJECT_SEQUENCE:=0A@@=20-2161,6=20+2165,8=20@@=20= stringify_adefprivs_objtype(ObjectType=20objtype)=0A=20=09{=0A=20=09=09= case=20OBJECT_COLUMN:=0A=20=09=09=09return=20"COLUMNS";=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09return=20"CONFIGURATION=20PARAMETERS";=0A= =20=09=09case=20OBJECT_TABLE:=0A=20=09=09=09return=20"TABLES";=0A=20=09=09= case=20OBJECT_SEQUENCE:=0Adiff=20--git=20= a/src/backend/commands/seclabel.c=20b/src/backend/commands/seclabel.c=0A= index=2053c18628a7..6a0fe325cf=20100644=0A---=20= a/src/backend/commands/seclabel.c=0A+++=20= b/src/backend/commands/seclabel.c=0A@@=20-67,6=20+67,7=20@@=20= SecLabelSupportsObjectType(ObjectType=20objtype)=0A=20=09=09case=20= OBJECT_ATTRIBUTE:=0A=20=09=09case=20OBJECT_CAST:=0A=20=09=09case=20= OBJECT_COLLATION:=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09=09case=20= OBJECT_CONVERSION:=0A=20=09=09case=20OBJECT_DEFAULT:=0A=20=09=09case=20= OBJECT_DEFACL:=0Adiff=20--git=20a/src/backend/commands/tablecmds.c=20= b/src/backend/commands/tablecmds.c=0Aindex=20785b282e69..c600169cbd=20= 100644=0A---=20a/src/backend/commands/tablecmds.c=0A+++=20= b/src/backend/commands/tablecmds.c=0A@@=20-12262,6=20+12262,7=20@@=20= ATExecAlterColumnType(AlteredTableInfo=20*tab,=20Relation=20rel,=0A=20=09= =09=09case=20OCLASS_TYPE:=0A=20=09=09=09case=20OCLASS_CAST:=0A=20=09=09=09= case=20OCLASS_COLLATION:=0A+=09=09=09case=20OCLASS_CONFIG_PARAM:=0A=20=09= =09=09case=20OCLASS_CONVERSION:=0A=20=09=09=09case=20OCLASS_LANGUAGE:=0A=20= =09=09=09case=20OCLASS_LARGEOBJECT:=0Adiff=20--git=20= a/src/backend/parser/gram.y=20b/src/backend/parser/gram.y=0Aindex=20= a6d0cefa6b..2adadaa6e4=20100644=0A---=20a/src/backend/parser/gram.y=0A= +++=20b/src/backend/parser/gram.y=0A@@=20-348,8=20+348,8=20@@=20static=20= Node=20*makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20= Node=20*query);=0A=20%type=20=09=09foreign_server_version=20= opt_foreign_server_version=0A=20%type=20=09=09opt_in_database=0A=20=0A= -%type=20=09=09OptSchemaName=0A-%type=20=09OptSchemaEltList=0A= +%type=20=09=09OptSchemaName=20cfgparam_name=0A+%type=20=09= OptSchemaEltList=20cfgparam_target=0A=20=0A=20%type=20=09=09am_type=0A= =20=0A@@=20-387,8=20+387,8=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20%type=20=09=09iso_level=20opt_encoding=0A=20%type=20= =20grantee=0A=20%type=20=09grantee_list=0A-%type=20= =20privilege=0A-%type=20=09privileges=20privilege_list=0A= +%type=20=20privilege=20guc_priv=0A+%type=20=09= privileges=20privilege_list=20guc_priv_list=0A=20%type=20=20= privilege_target=0A=20%type=20=20function_with_argtypes=20= aggregate_with_argtypes=20operator_with_argtypes=0A=20%type=20=09= function_with_argtypes_list=20aggregate_with_argtypes_list=20= operator_with_argtypes_list=0A@@=20-698,7=20+698,7=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20=09ORDER=20ORDINALITY=20OTHERS=20OUT_P=20OUTER_P=0A=20=09= OVER=20OVERLAPS=20OVERLAY=20OVERRIDING=20OWNED=20OWNER=0A=20=0A-=09= PARALLEL=20PARSER=20PARTIAL=20PARTITION=20PASSING=20PASSWORD=20PLACING=20= PLANS=20POLICY=0A+=09PARALLEL=20PARAMETER=20PARSER=20PARTIAL=20PARTITION=20= PASSING=20PASSWORD=20PLACING=20PLANS=20POLICY=0A=20=09POSITION=20= PRECEDING=20PRECISION=20PRESERVE=20PREPARE=20PREPARED=20PRIMARY=0A=20=09= PRIOR=20PRIVILEGES=20PROCEDURAL=20PROCEDURE=20PROCEDURES=20PROGRAM=20= PUBLICATION=0A=20=0A@@=20-6884,6=20+6884,20=20@@=20GrantStmt:=09GRANT=20= privileges=20ON=20privilege_target=20TO=20grantee_list=0A=20=09=09=09=09=09= n->grantor=20=3D=20$8;=0A=20=09=09=09=09=09$$=20=3D=20(Node*)n;=0A=20=09=09= =09=09}=0A+=09=09=09|=20GRANT=20guc_priv_list=20ON=20cfgparam_target=20= TO=20grantee_list=0A+=09=09=09opt_grant_grant_option=20opt_granted_by=0A= +=09=09=09=09{=0A+=09=09=09=09=09GrantStmt=20*n=20=3D=20= makeNode(GrantStmt);=0A+=09=09=09=09=09n->is_grant=20=3D=20true;=0A+=09=09= =09=09=09n->privileges=20=3D=20$2;=0A+=09=09=09=09=09n->targtype=20=3D=20= ACL_TARGET_OBJECT;=0A+=09=09=09=09=09n->objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09n->objects=20=3D=20$4;=0A+=09=09=09= =09=09n->grantees=20=3D=20$6;=0A+=09=09=09=09=09n->grant_option=20=3D=20= $7;=0A+=09=09=09=09=09n->grantor=20=3D=20$8;=0A+=09=09=09=09=09$$=20=3D=20= (Node*)n;=0A+=09=09=09=09}=0A=20=09=09;=0A=20=0A=20RevokeStmt:=0A@@=20= -6917,6=20+6931,36=20@@=20RevokeStmt:=0A=20=09=09=09=09=09n->behavior=20= =3D=20$11;=0A=20=09=09=09=09=09$$=20=3D=20(Node=20*)n;=0A=20=09=09=09=09= }=0A+=09=09=09|=20REVOKE=20guc_priv_list=20ON=20cfgparam_target=20FROM=20= grantee_list=0A+=09=09=09opt_granted_by=20opt_drop_behavior=0A+=09=09=09=09= {=0A+=09=09=09=09=09GrantStmt=20*n=20=3D=20makeNode(GrantStmt);=0A+=09=09= =09=09=09n->is_grant=20=3D=20false;=0A+=09=09=09=09=09n->grant_option=20= =3D=20false;=0A+=09=09=09=09=09n->privileges=20=3D=20$2;=0A+=09=09=09=09=09= n->targtype=20=3D=20ACL_TARGET_OBJECT;=0A+=09=09=09=09=09n->objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09n->objects=20=3D=20$4;=0A+=09=09=09= =09=09n->grantees=20=3D=20$6;=0A+=09=09=09=09=09n->grantor=20=3D=20$7;=0A= +=09=09=09=09=09n->behavior=20=3D=20$8;=0A+=09=09=09=09=09$$=20=3D=20= (Node=20*)n;=0A+=09=09=09=09}=0A+=09=09=09|=20REVOKE=20GRANT=20OPTION=20= FOR=20guc_priv_list=20ON=20cfgparam_target=0A+=09=09=09FROM=20= grantee_list=20opt_granted_by=20opt_drop_behavior=0A+=09=09=09=09{=0A+=09= =09=09=09=09GrantStmt=20*n=20=3D=20makeNode(GrantStmt);=0A+=09=09=09=09=09= n->is_grant=20=3D=20false;=0A+=09=09=09=09=09n->grant_option=20=3D=20= true;=0A+=09=09=09=09=09n->privileges=20=3D=20$5;=0A+=09=09=09=09=09= n->targtype=20=3D=20ACL_TARGET_OBJECT;=0A+=09=09=09=09=09n->objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09n->objects=20=3D=20$7;=0A+=09=09=09= =09=09n->grantees=20=3D=20$9;=0A+=09=09=09=09=09n->grantor=20=3D=20$10;=0A= +=09=09=09=09=09n->behavior=20=3D=20$11;=0A+=09=09=09=09=09$$=20=3D=20= (Node=20*)n;=0A+=09=09=09=09}=0A=20=09=09;=0A=20=0A=20=0A@@=20-6985,6=20= +7029,27=20@@=20privilege:=09SELECT=20opt_column_list=0A=20=09=09=09}=0A=20= =09=09;=0A=20=0A+guc_priv_list:=20guc_priv=09=09=09=09=09=09=09=09{=20$$=20= =3D=20list_make1($1);=20}=0A+=09=09=09|=20guc_priv_list=20','=20guc_priv=09= =09=09{=20$$=20=3D=20lappend($1,=20$3);=20}=0A+=09=09;=0A+=0A+guc_priv:=0A= +=09=09ALTER=20SYSTEM_P=0A+=09=09=09{=0A+=09=09=09=09AccessPriv=20*n=20=3D= =20makeNode(AccessPriv);=0A+=09=09=09=09n->priv_name=20=3D=20= pstrdup("alter=20system");=0A+=09=09=09=09n->cols=20=3D=20NIL;=0A+=09=09=09= =09$$=20=3D=20n;=0A+=09=09=09}=0A+=09=09|=20SET=20VALUE_P=0A+=09=09=09{=0A= +=09=09=09=09AccessPriv=20*n=20=3D=20makeNode(AccessPriv);=0A+=09=09=09=09= n->priv_name=20=3D=20pstrdup("set=20value");=0A+=09=09=09=09n->cols=20=3D=20= NIL;=0A+=09=09=09=09$$=20=3D=20n;=0A+=09=09=09}=0A+=09=09;=0A+=0A=20=0A=20= /*=20Don't=20bother=20trying=20to=20fold=20the=20first=20two=20rules=20= into=20one=20using=0A=20=20*=20opt_table.=20=20You're=20going=20to=20get=20= conflicts.=0A@@=20-10658,6=20+10723,28=20@@=20any_with:=09WITH=0A=20=09=09= ;=0A=20=0A=20=0A+cfgparam_target:=0A+=09=09=09cfgparam_name=0A+=09=09=09=09= {=0A+=09=09=09=09=09$$=20=3D=20list_make1(makeString($1));=0A+=09=09=09=09= }=0A+=09=09=09|=20cfgparam_target=20','=20cfgparam_name=0A+=09=09=09=09{=0A= +=09=09=09=09=09$$=20=3D=20lappend($1,=20makeString($3));=0A+=09=09=09=09= }=0A+=09=09;=0A+=0A+cfgparam_name:=0A+=09=09=09ColId=0A+=09=09=09=09{=0A= +=09=09=09=09=09$$=20=3D=20$1;=0A+=09=09=09=09}=0A+=09=09=09|=20= cfgparam_name=20'.'=20ColId=0A+=09=09=09=09{=0A+=09=09=09=09=09$$=20=3D=20= psprintf("%s.%s",=20$1,=20$3);=0A+=09=09=09=09}=0A+=09=09;=0A+=0A=20= /*************************************************************************= ****=0A=20=20*=0A=20=20*=20Manipulate=20a=20conversion=0A@@=20-15728,6=20= +15815,7=20@@=20unreserved_keyword:=0A=20=09=09=09|=20OWNED=0A=20=09=09=09= |=20OWNER=0A=20=09=09=09|=20PARALLEL=0A+=09=09=09|=20PARAMETER=0A=20=09=09= =09|=20PARSER=0A=20=09=09=09|=20PARTIAL=0A=20=09=09=09|=20PARTITION=0A@@=20= -16306,6=20+16394,7=20@@=20bare_label_keyword:=0A=20=09=09=09|=20OWNED=0A= =20=09=09=09|=20OWNER=0A=20=09=09=09|=20PARALLEL=0A+=09=09=09|=20= PARAMETER=0A=20=09=09=09|=20PARSER=0A=20=09=09=09|=20PARTIAL=0A=20=09=09=09= |=20PARTITION=0Adiff=20--git=20a/src/backend/utils/adt/acl.c=20= b/src/backend/utils/adt/acl.c=0Aindex=2067f8b29434..895b542916=20100644=0A= ---=20a/src/backend/utils/adt/acl.c=0A+++=20= b/src/backend/utils/adt/acl.c=0A@@=20-22,6=20+22,7=20@@=0A=20#include=20= "catalog/pg_auth_members.h"=0A=20#include=20"catalog/pg_authid.h"=0A=20= #include=20"catalog/pg_class.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_database.h"=0A=20= #include=20"catalog/pg_type.h"=0A=20#include=20"commands/dbcommands.h"=0A= @@=20-36,6=20+37,7=20@@=0A=20#include=20"utils/array.h"=0A=20#include=20= "utils/builtins.h"=0A=20#include=20"utils/catcache.h"=0A+#include=20= "utils/guc.h"=0A=20#include=20"utils/inval.h"=0A=20#include=20= "utils/lsyscache.h"=0A=20#include=20"utils/memutils.h"=0A@@=20-306,6=20= +308,12=20@@=20aclparse(const=20char=20*s,=20AclItem=20*aip)=0A=20=09=09=09= case=20ACL_CONNECT_CHR:=0A=20=09=09=09=09read=20=3D=20ACL_CONNECT;=0A=20=09= =09=09=09break;=0A+=09=09=09case=20ACL_SET_CHR:=0A+=09=09=09=09read=20=3D=20= ACL_SET;=0A+=09=09=09=09break;=0A+=09=09=09case=20ACL_ALTER_SYSTEM_CHR:=0A= +=09=09=09=09read=20=3D=20ACL_ALTER_SYSTEM;=0A+=09=09=09=09break;=0A=20=09= =09=09case=20'R':=09=09=09/*=20ignore=20old=20RULE=20privileges=20*/=0A=20= =09=09=09=09read=20=3D=200;=0A=20=09=09=09=09break;=0A@@=20-794,6=20= +802,10=20@@=20acldefault(ObjectType=20objtype,=20Oid=20ownerId)=0A=20=09= =09=09world_default=20=3D=20ACL_USAGE;=0A=20=09=09=09owner_default=20=3D=20= ACL_ALL_RIGHTS_TYPE;=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09world_default=20=3D=20ACL_NO_RIGHTS;=0A= +=09=09=09owner_default=20=3D=20ACL_NO_RIGHTS;=0A+=09=09=09break;=0A=20=09= =09default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20objtype:=20%d",=20= (int)=20objtype);=0A=20=09=09=09world_default=20=3D=20ACL_NO_RIGHTS;=09= /*=20keep=20compiler=20quiet=20*/=0A@@=20-1602,6=20+1614,10=20@@=20= convert_priv_string(text=20*priv_type_text)=0A=20=09=09return=20= ACL_CREATE_TEMP;=0A=20=09if=20(pg_strcasecmp(priv_type,=20"CONNECT")=20= =3D=3D=200)=0A=20=09=09return=20ACL_CONNECT;=0A+=09if=20= (pg_strcasecmp(priv_type,=20"SET=20VALUE")=20=3D=3D=200)=0A+=09=09return=20= ACL_SET;=0A+=09if=20(pg_strcasecmp(priv_type,=20"ALTER=20SYSTEM")=20=3D=3D= =200)=0A+=09=09return=20ACL_ALTER_SYSTEM;=0A=20=09if=20= (pg_strcasecmp(priv_type,=20"RULE")=20=3D=3D=200)=0A=20=09=09return=200;=09= =09=09=09/*=20ignore=20old=20RULE=20privileges=20*/=0A=20=0A@@=20-1698,6=20= +1714,10=20@@=20convert_aclright_to_string(int=20aclright)=0A=20=09=09=09= return=20"TEMPORARY";=0A=20=09=09case=20ACL_CONNECT:=0A=20=09=09=09= return=20"CONNECT";=0A+=09=09case=20ACL_SET:=0A+=09=09=09return=20"SET=20= VALUE";=0A+=09=09case=20ACL_ALTER_SYSTEM:=0A+=09=09=09return=20"ALTER=20= SYSTEM";=0A=20=09=09default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20= aclright:=20%d",=20aclright);=0A=20=09=09=09return=20NULL;=0A@@=20= -4670,6=20+4690,44=20@@=20initialize_acl(void)=0A=20=09}=0A=20}=0A=20=0A= +/*=0A+=20*=20get_cfgparam_oid=20-=20Given=20a=20configuration=20= parameter=20name,=20look=20up=20the=0A+=20*=20configuration=20= parameter's=20OID.=20=20Note=20that=20names=20which=20are=20aliases=20= for=0A+=20*=20a=20canonical=20name=20will=20be=20translated=20= automatically=20and=20the=20OID=20found.=0A+=20*=0A+=20*=20If=20= missing_ok=20is=20false,=20throw=20an=20error=20if=20the=20configuration=20= parameter=20name=0A+=20*=20is=20not=20found.=0A+=20*=0A+=20*=20Returns=20= the=20Oid=20of=20the=20configuration=20parameter.=0A+=20*/=0A+Oid=0A= +get_cfgparam_oid(const=20char=20*cfgname,=20bool=20missing_ok)=0A+{=0A+=09= Oid=09=09=09oid;=0A+=0A+=09/*=20Check=20for=20the=20variable=20by=20the=20= name=20we=20were=20given=20*/=0A+=09oid=20=3D=20= GetSysCacheOid1(CONFIGNAME,=20Anum_pg_config_param_oid,=0A+=09=09=09=09=09= =09=20=20PointerGetDatum(cstring_to_text(cfgname)));=0A+=09if=20= (!OidIsValid(oid))=0A+=09{=0A+=09=09const=20char=20*canonical;=0A+=0A+=09= =09/*=20Check=20if=20the=20variable=20has=20a=20different=20canonical=20= spelling=20*/=0A+=09=09canonical=20=3D=20= GetConfigOptionCanonicalName(cfgname);=0A+=09=09if=20(canonical=20!=3D=20= NULL)=0A+=09=09=09oid=20=3D=20GetSysCacheOid1(CONFIGNAME,=20= Anum_pg_config_param_oid,=0A+=09=09=09=09=09=09=09=09=20=20= PointerGetDatum(cstring_to_text(canonical)));=0A+=0A+=09=09if=20= (!OidIsValid(oid)=20&&=20!missing_ok)=0A+=09=09=09ereport(ERROR,=0A+=09=09= =09=09=09(errcode(ERRCODE_UNDEFINED_OBJECT),=0A+=09=09=09=09=09=20= errmsg("configuration=20parameter=20\"%s\"=20does=20not=20exist",=0A+=09=09= =09=09=09=09=09cfgname)));=0A+=09}=0A+=0A+=09return=20oid;=0A+}=0A+=0A=20= /*=0A=20=20*=20RoleMembershipCacheCallback=0A=20=20*=09=09Syscache=20= inval=20callback=20function=0Adiff=20--git=20= a/src/backend/utils/cache/lsyscache.c=20= b/src/backend/utils/cache/lsyscache.c=0Aindex=204ebaa552a2..b8768f7506=20= 100644=0A---=20a/src/backend/utils/cache/lsyscache.c=0A+++=20= b/src/backend/utils/cache/lsyscache.c=0A@@=20-25,6=20+25,7=20@@=0A=20= #include=20"catalog/pg_amproc.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_language.h"=0A=20#include=20= "catalog/pg_namespace.h"=0A@@=20-3304,6=20+3305,25=20@@=20= free_attstatsslot(AttStatsSlot=20*sslot)=0A=20=09=09= pfree(sslot->numbers_arr);=0A=20}=0A=20=0A+char=20*=0A= +get_cfgparam_name(Oid=20configid)=0A+{=0A+=09HeapTuple=09tp;=0A+=0A+=09= tp=20=3D=20SearchSysCache1(CONFIGOID,=20ObjectIdGetDatum(configid));=0A+=09= if=20(HeapTupleIsValid(tp))=0A+=09{=0A+=09=09Form_pg_config_param=20= configtup=20=3D=20(Form_pg_config_param)=20GETSTRUCT(tp);=0A+=09=09char=09= =20=20=20*result;=0A+=0A+=09=09result=20=3D=20= pstrdup(text_to_cstring(&configtup->configname));=0A+=09=09= ReleaseSysCache(tp);=0A+=09=09return=20result;=0A+=09}=0A+=09else=0A+=09=09= return=20NULL;=0A+}=0A+=0A=20/*=09=09=09=09----------=20PG_NAMESPACE=20= CACHE=20----------=09=09=09=09=20*/=0A=20=0A=20/*=0Adiff=20--git=20= a/src/backend/utils/cache/syscache.c=20= b/src/backend/utils/cache/syscache.c=0Aindex=2056870b46e4..e66158d584=20= 100644=0A---=20a/src/backend/utils/cache/syscache.c=0A+++=20= b/src/backend/utils/cache/syscache.c=0A@@=20-30,6=20+30,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-310,6=20+311,28=20@@=20static=20const=20= struct=20cachedesc=20cacheinfo[]=20=3D=20{=0A=20=09=09},=0A=20=09=098=0A=20= =09},=0A+=09{ConfigParamRelationId,=09=09/*=20CONFIGNAME=20*/=0A+=09=09= ConfigParamNameIndexId,=0A+=09=091,=0A+=09=09{=0A+=09=09=09= Anum_pg_config_param_configname,=0A+=09=09=090,=0A+=09=09=090,=0A+=09=09=09= 0=0A+=09=09},=0A+=09=094=0A+=09},=0A+=09{ConfigParamRelationId,=09=09/*=20= CONFIGOID=20*/=0A+=09=09ConfigParamOidIndexId,=0A+=09=091,=0A+=09=09{=0A= +=09=09=09Anum_pg_config_param_oid,=0A+=09=09=090,=0A+=09=09=090,=0A+=09=09= =090=0A+=09=09},=0A+=09=094=0A+=09},=0A=20=09{ConversionRelationId,=09=09= /*=20CONDEFAULT=20*/=0A=20=09=09ConversionDefaultIndexId,=0A=20=09=094,=0A= diff=20--git=20a/src/backend/utils/misc/guc.c=20= b/src/backend/utils/misc/guc.c=0Aindex=20e91d5a3cfd..446e42d320=20100644=0A= ---=20a/src/backend/utils/misc/guc.c=0A+++=20= b/src/backend/utils/misc/guc.c=0A@@=20-5021,6=20+5021,10=20@@=20static=20= struct=20config_enum=20ConfigureNamesEnum[]=20=3D=0A=20=20*=20the=20= following=20mappings=20to=20any=20unrecognized=20name.=20=20Note=20that=20= an=20old=20name=0A=20=20*=20should=20be=20mapped=20to=20a=20new=20one=20= only=20if=20the=20new=20variable=20has=20very=20similar=0A=20=20*=20= semantics=20to=20the=20old.=0A+=20*=0A+=20*=20If=20you=20deprecate=20a=20= name=20in=20favor=20of=20a=20new=20spelling,=20be=20sure=20to=20consider=20= what=0A+=20*=20upgrade=20support=20will=20be=20needed,=20if=20any,=20for=20= existing=20pg_config_param=0A+=20*=20entries.=0A=20=20*/=0A=20static=20= const=20char=20*const=20map_old_guc_names[]=20=3D=20{=0A=20=09= "sort_mem",=20"work_mem",=0A@@=20-5420,25=20+5424,29=20@@=20= add_guc_variable(struct=20config_generic=20*var,=20int=20elevel)=0A=20}=0A= =20=0A=20/*=0A-=20*=20Decide=20whether=20a=20proposed=20custom=20= variable=20name=20is=20allowed.=0A+=20*=20Decide=20whether=20a=20= proposed=20variable=20name=20is=20allowed.=0A=20=20*=0A-=20*=20It=20must=20= be=20two=20or=20more=20identifiers=20separated=20by=20dots,=20where=20= the=20rules=0A-=20*=20for=20what=20is=20an=20identifier=20agree=20with=20= scan.l.=20=20(If=20you=20change=20this=20rule,=0A-=20*=20adjust=20the=20= errdetail=20in=20find_option().)=0A+=20*=20It=20must=20be=20one=20or=20= more=20identifiers=20separated=20by=20zero=20or=20more=20dots,=20where=20= the=0A+=20*=20rules=20for=20what=20is=20an=20identifier=20agree=20with=20= scan.l.=20=20(If=20you=20change=20this=0A+=20*=20rule,=20adjust=20the=20= errdetail=20in=20find_option().)=0A+=20*=0A+=20*=20partcnt:=20returns=20= by=20reference=20the=20number=20of=20dot=20separated=20identifiers.=0A=20= =20*/=0A-static=20bool=0A-valid_custom_variable_name(const=20char=20= *name)=0A+bool=0A+valid_variable_name(const=20char=20*name,=20int=20= *partcnt)=0A=20{=0A-=09bool=09=09saw_sep=20=3D=20false;=0A+=09int=09=09=09= parts=20=3D=201;=0A=20=09bool=09=09name_start=20=3D=20true;=0A=20=0A+=09= if=20(partcnt)=0A+=09=09*partcnt=20=3D=20-1;=0A=20=09for=20(const=20char=20= *p=20=3D=20name;=20*p;=20p++)=0A=20=09{=0A=20=09=09if=20(*p=20=3D=3D=20= GUC_QUALIFIER_SEPARATOR)=0A=20=09=09{=0A=20=09=09=09if=20(name_start)=0A=20= =09=09=09=09return=20false;=09/*=20empty=20name=20component=20*/=0A-=09=09= =09saw_sep=20=3D=20true;=0A+=09=09=09parts++;=0A=20=09=09=09name_start=20= =3D=20true;=0A=20=09=09}=0A=20=09=09else=20if=20= (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ"=0A@@=20-5455,8=20+5463,24=20@@=20= valid_custom_variable_name(const=20char=20*name)=0A=20=09}=0A=20=09if=20= (name_start)=0A=20=09=09return=20false;=09=09=09/*=20empty=20name=20= component=20*/=0A-=09/*=20OK=20if=20we=20found=20at=20least=20one=20= separator=20*/=0A-=09return=20saw_sep;=0A+=09if=20(partcnt)=0A+=09=09= *partcnt=20=3D=20parts;=0A+=09return=20true;=0A+}=0A+=0A+/*=0A+=20*=20= Decide=20whether=20a=20proposed=20custom=20variable=20name=20is=20= allowed.=0A+=20*=0A+=20*=20It=20must=20be=20two=20or=20more=20= identifiers=20separated=20by=20dots,=20where=20the=20rules=0A+=20*=20for=20= what=20is=20an=20identifier=20agree=20with=20scan.l.=20=20(If=20you=20= change=20this=20rule,=0A+=20*=20adjust=20the=20errdetail=20in=20= find_option().)=0A+=20*/=0A+static=20bool=0A= +valid_custom_variable_name(const=20char=20*name)=0A+{=0A+=09int=09=09=09= partcnt;=0A+=0A+=09return=20(valid_variable_name(name,=20&partcnt)=20&&=20= partcnt=20>=201);=0A=20}=0A=20=0A=20/*=0A@@=20-8533,16=20+8557,32=20@@=20= AlterSystemSetConfigFile(AlterSystemStmt=20*altersysstmt)=0A=20=09char=09= =09AutoConfFileName[MAXPGPATH];=0A=20=09char=09=09= AutoConfTmpFileName[MAXPGPATH];=0A=20=0A-=09if=20(!superuser())=0A-=09=09= ereport(ERROR,=0A-=09=09=09=09(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A= -=09=09=09=09=20errmsg("must=20be=20superuser=20to=20execute=20ALTER=20= SYSTEM=20command")));=0A-=0A=20=09/*=0A=20=09=20*=20Extract=20statement=20= arguments=0A=20=09=20*/=0A=20=09name=20=3D=20= altersysstmt->setstmt->name;=0A=20=0A+=09/*=0A+=09=20*=20Check=20= permission=20to=20run=20ALTER=20SYSTEM=20on=20the=20target=20variable=20= registered.=0A+=09=20*/=0A+=09if=20(!superuser())=0A+=09{=0A+=09=09= AclResult=09aclresult;=0A+=09=09Oid=09=09=09cfgId;=0A+=0A+=09=09cfgId=20= =3D=20get_cfgparam_oid(name,=20true);=0A+=09=09if=20(!OidIsValid(cfgId))=0A= +=09=09=09ereport(ERROR,=0A+=09=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=09=20= errmsg("permission=20denied=20to=20set=20parameter=20\"%s\"",=0A+=09=09=09= =09=09=09=09name)));=0A+=0A+=09=09aclresult=20=3D=20= pg_config_param_aclcheck(cfgId,=20GetUserId(),=0A+=09=09=09=09=09=09=09=09= =09=09=09=20ACL_ALTER_SYSTEM);=0A+=09=09if=20(aclresult=20!=3D=20= ACLCHECK_OK)=0A+=09=09=09aclcheck_error(aclresult,=20= OBJECT_CONFIG_PARAM,=20name);=0A+=09}=0A+=0A=20=09switch=20= (altersysstmt->setstmt->kind)=0A=20=09{=0A=20=09=09case=20VAR_SET_VALUE:=0A= @@=20-8735,6=20+8775,9=20@@=20void=0A=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20{=0A= =20=09GucAction=09action=20=3D=20stmt->is_local=20?=20GUC_ACTION_LOCAL=20= :=20GUC_ACTION_SET;=0A+=09GucContext=09context;=0A+=09AclResult=09= aclresult;=0A+=09Oid=09=09=09cfgId;=0A=20=0A=20=09/*=0A=20=09=20*=20= Workers=20synchronize=20these=20parameters=20at=20the=20start=20of=20the=20= parallel=0A@@=20-8745,6=20+8788,20=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=09= =09=09=09(errcode(ERRCODE_INVALID_TRANSACTION_STATE),=0A=20=09=09=09=09=20= errmsg("cannot=20set=20parameters=20during=20a=20parallel=20= operation")));=0A=20=0A+=09/*=0A+=09=20*=20Superusers=20and=20users=20= who=20have=20been=20granted=20SET=20privilege=20can=20set=20with=0A+=09=20= *=20PGC_SUSET=20context.=20=20All=20others=20have=20only=20PGC_USERSET.=0A= +=09=20*/=0A+=09context=20=3D=20PGC_USERSET;=0A+=09if=20(superuser())=0A= +=09=09context=20=3D=20PGC_SUSET;=0A+=09else=20if=20(OidIsValid(cfgId=20= =3D=20get_cfgparam_oid(stmt->name,=20true)))=0A+=09{=0A+=09=09aclresult=20= =3D=20pg_config_param_aclcheck(cfgId,=20GetUserId(),=20ACL_SET);=0A+=09=09= if=20(aclresult=20=3D=3D=20ACLCHECK_OK)=0A+=09=09=09context=20=3D=20= PGC_SUSET;=0A+=09}=0A+=0A=20=09switch=20(stmt->kind)=0A=20=09{=0A=20=09=09= case=20VAR_SET_VALUE:=0A@@=20-8753,7=20+8810,7=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=09= =09=09=09WarnNoTransactionBlock(isTopLevel,=20"SET=20LOCAL");=0A=20=09=09= =09(void)=20set_config_option(stmt->name,=0A=20=09=09=09=09=09=09=09=09=09= =20ExtractSetVariableArgs(stmt),=0A-=09=09=09=09=09=09=09=09=09=20= (superuser()=20?=20PGC_SUSET=20:=20PGC_USERSET),=0A+=09=09=09=09=09=09=09= =09=09=20context,=0A=20=09=09=09=09=09=09=09=09=09=20PGC_S_SESSION,=0A=20= =09=09=09=09=09=09=09=09=09=20action,=20true,=200,=20false);=0A=20=09=09=09= break;=0A@@=20-8838,7=20+8895,7=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=0A= =20=09=09=09(void)=20set_config_option(stmt->name,=0A=20=09=09=09=09=09=09= =09=09=09=20NULL,=0A-=09=09=09=09=09=09=09=09=09=20(superuser()=20?=20= PGC_SUSET=20:=20PGC_USERSET),=0A+=09=09=09=09=09=09=09=09=09=20context,=0A= =20=09=09=09=09=09=09=09=09=09=20PGC_S_SESSION,=0A=20=09=09=09=09=09=09=09= =09=09=20action,=20true,=200,=20false);=0A=20=09=09=09break;=0A@@=20= -9578,6=20+9635,22=20@@=20get_explain_guc_options(int=20*num)=0A=20=09= return=20result;=0A=20}=0A=20=0A+/*=0A+=20*=20Return=20GUC=20variable=20= canonical=20name,=20or=20NULL=20if=20no=20variable=20by=20the=20given=0A= +=20*=20name=20or=20alias=20exists.=0A+=20*/=0A+const=20char=20*=0A= +GetConfigOptionCanonicalName(const=20char=20*alias)=0A+{=0A+=09struct=20= config_generic=20*record;=0A+=0A+=09record=20=3D=20find_option(alias,=20= false,=20true,=20LOG);=0A+=09if=20(record=20=3D=3D=20NULL)=0A+=09=09= return=20NULL;=0A+=0A+=09return=20record->name;=0A+}=0A+=0A=20/*=0A=20=20= *=20Return=20GUC=20variable=20value=20by=20name;=20optionally=20return=20= canonical=20form=20of=0A=20=20*=20name.=20=20If=20the=20GUC=20is=20= unset,=20then=20throw=20an=20error=20unless=20missing_ok=20is=20true,=0A= diff=20--git=20a/src/bin/pg_dump/dumputils.c=20= b/src/bin/pg_dump/dumputils.c=0Aindex=20ea67e52a3f..07298198e3=20100644=0A= ---=20a/src/bin/pg_dump/dumputils.c=0A+++=20= b/src/bin/pg_dump/dumputils.c=0A@@=20-37,7=20+37,7=20@@=20static=20void=20= AddAcl(PQExpBuffer=20aclbuf,=20const=20char=20*keyword,=0A=20=20*=09= nspname:=20the=20namespace=20the=20object=20is=20in=20(NULL=20if=20= none);=20not=20pre-quoted=0A=20=20*=09type:=20the=20object=20type=20(as=20= seen=20in=20GRANT=20command:=20must=20be=20one=20of=0A=20=20*=09=09= TABLE,=20SEQUENCE,=20FUNCTION,=20PROCEDURE,=20LANGUAGE,=20SCHEMA,=20= DATABASE,=20TABLESPACE,=0A-=20*=09=09FOREIGN=20DATA=20WRAPPER,=20SERVER,=20= or=20LARGE=20OBJECT)=0A+=20*=09=09FOREIGN=20DATA=20WRAPPER,=20SERVER,=20= CONFIGURATION=20PARAMETER=20or=20LARGE=20OBJECT)=0A=20=20*=09acls:=20the=20= ACL=20string=20fetched=20from=20the=20database=0A=20=20*=09racls:=20the=20= ACL=20string=20of=20any=20initial-but-now-revoked=20privileges=0A=20=20*=09= owner:=20username=20of=20object=20owner=20(will=20be=20passed=20through=20= fmtId);=20can=20be=0A@@=20-573,6=20+573,11=20@@=20do=20{=20\=0A=20=09=09= CONVERT_PRIV('U',=20"USAGE");=0A=20=09else=20if=20(strcmp(type,=20= "FOREIGN=20TABLE")=20=3D=3D=200)=0A=20=09=09CONVERT_PRIV('r',=20= "SELECT");=0A+=09else=20if=20(strcmp(type,=20"CONFIGURATION=20= PARAMETER")=20=3D=3D=200)=0A+=09{=0A+=09=09CONVERT_PRIV('s',=20"SET=20= VALUE");=0A+=09=09CONVERT_PRIV('A',=20"ALTER=20SYSTEM");=0A+=09}=0A=20=09= else=20if=20(strcmp(type,=20"LARGE=20OBJECT")=20=3D=3D=200)=0A=20=09{=0A=20= =09=09CONVERT_PRIV('r',=20"SELECT");=0Adiff=20--git=20= a/src/bin/pg_dump/pg_backup_archiver.c=20= b/src/bin/pg_dump/pg_backup_archiver.c=0Aindex=2059f4fbb2cc..aaadac8e32=20= 100644=0A---=20a/src/bin/pg_dump/pg_backup_archiver.c=0A+++=20= b/src/bin/pg_dump/pg_backup_archiver.c=0A@@=20-3413,6=20+3413,7=20@@=20= _getObjectDescription(PQExpBuffer=20buf,=20TocEntry=20*te)=0A=20=09=09= strcmp(type,=20"SCHEMA")=20=3D=3D=200=20||=0A=20=09=09strcmp(type,=20= "EVENT=20TRIGGER")=20=3D=3D=200=20||=0A=20=09=09strcmp(type,=20"FOREIGN=20= DATA=20WRAPPER")=20=3D=3D=200=20||=0A+=09=09strcmp(type,=20= "CONFIGURATION=20PARAMETER")=20=3D=3D=200=20||=0A=20=09=09strcmp(type,=20= "SERVER")=20=3D=3D=200=20||=0A=20=09=09strcmp(type,=20"PUBLICATION")=20= =3D=3D=200=20||=0A=20=09=09strcmp(type,=20"SUBSCRIPTION")=20=3D=3D=200=20= ||=0A@@=20-3596,6=20+3597,7=20@@=20_printTocEntry(ArchiveHandle=20*AH,=20= TocEntry=20*te,=20bool=20isData)=0A=20=09=09=09strcmp(te->desc,=20"TEXT=20= SEARCH=20DICTIONARY")=20=3D=3D=200=20||=0A=20=09=09=09strcmp(te->desc,=20= "TEXT=20SEARCH=20CONFIGURATION")=20=3D=3D=200=20||=0A=20=09=09=09= strcmp(te->desc,=20"FOREIGN=20DATA=20WRAPPER")=20=3D=3D=200=20||=0A+=09=09= =09strcmp(te->desc,=20"CONFIGURATION=20PARAMETER")=20=3D=3D=200=20||=0A=20= =09=09=09strcmp(te->desc,=20"SERVER")=20=3D=3D=200=20||=0A=20=09=09=09= strcmp(te->desc,=20"STATISTICS")=20=3D=3D=200=20||=0A=20=09=09=09= strcmp(te->desc,=20"PUBLICATION")=20=3D=3D=200=20||=0Adiff=20--git=20= a/src/bin/pg_dump/pg_dump.c=20b/src/bin/pg_dump/pg_dump.c=0Aindex=20= 5a2094de9f..9e79fd129f=20100644=0A---=20a/src/bin/pg_dump/pg_dump.c=0A= +++=20b/src/bin/pg_dump/pg_dump.c=0A@@=20-15078,6=20+15078,9=20@@=20= dumpDefaultACL(Archive=20*fout,=20const=20DefaultACLInfo=20*daclinfo)=0A=20= =09=09case=20DEFACLOBJ_NAMESPACE:=0A=20=09=09=09type=20=3D=20"SCHEMAS";=0A= =20=09=09=09break;=0A+=09=09case=20DEFACLOBJ_CONFIG_PARAM:=0A+=09=09=09= type=20=3D=20"CONFIGURATION=20PARAMETERS";=0A+=09=09=09break;=0A=20=09=09= default:=0A=20=09=09=09/*=20shouldn't=20get=20here=20*/=0A=20=09=09=09= fatal("unrecognized=20object=20type=20in=20default=20privileges:=20%d",=0A= @@=20-15123,7=20+15126,7=20@@=20dumpDefaultACL(Archive=20*fout,=20const=20= DefaultACLInfo=20*daclinfo)=0A=20=20*=09=09or=20InvalidDumpId=20if=20= there=20is=20no=20need=20for=20a=20second=20dependency.=0A=20=20*=20= 'type'=20must=20be=20one=20of=0A=20=20*=09=09TABLE,=20SEQUENCE,=20= FUNCTION,=20LANGUAGE,=20SCHEMA,=20DATABASE,=20TABLESPACE,=0A-=20*=09=09= FOREIGN=20DATA=20WRAPPER,=20SERVER,=20or=20LARGE=20OBJECT.=0A+=20*=09=09= FOREIGN=20DATA=20WRAPPER,=20SERVER,=20CONFIGURATION=20PARAMETER=20or=20= LARGE=20OBJECT.=0A=20=20*=20'name'=20is=20the=20formatted=20name=20of=20= the=20object.=20=20Must=20be=20quoted=20etc.=20already.=0A=20=20*=20= 'subname'=20is=20the=20formatted=20name=20of=20the=20sub-object,=20if=20= any.=20=20Must=20be=20quoted.=0A=20=20*=09=09(Currently=20we=20assume=20= that=20subname=20is=20only=20provided=20for=20table=20columns.)=0Adiff=20= --git=20a/src/bin/pg_dump/pg_dumpall.c=20b/src/bin/pg_dump/pg_dumpall.c=0A= index=20c29101704a..2f398c8094=20100644=0A---=20= a/src/bin/pg_dump/pg_dumpall.c=0A+++=20b/src/bin/pg_dump/pg_dumpall.c=0A= @@=20-36,6=20+36,7=20@@=20static=20void=20help(void);=0A=20static=20void=20= dropRoles(PGconn=20*conn);=0A=20static=20void=20dumpRoles(PGconn=20= *conn);=0A=20static=20void=20dumpRoleMembership(PGconn=20*conn);=0A= +static=20void=20dumpRoleGUCPrivs(PGconn=20*conn);=0A=20static=20void=20= dumpGroups(PGconn=20*conn);=0A=20static=20void=20dropTablespaces(PGconn=20= *conn);=0A=20static=20void=20dumpTablespaces(PGconn=20*conn);=0A@@=20= -586,6=20+587,10=20@@=20main(int=20argc,=20char=20*argv[])=0A=20=09=09=09= =09dumpRoleMembership(conn);=0A=20=09=09=09else=0A=20=09=09=09=09= dumpGroups(conn);=0A+=0A+=09=09=09/*=20Dump=20role=20guc=20privileges=20= */=0A+=09=09=09if=20(server_version=20>=3D=20150000)=0A+=09=09=09=09= dumpRoleGUCPrivs(conn);=0A=20=09=09}=0A=20=0A=20=09=09/*=20Dump=20= tablespaces=20*/=0A@@=20-1049,6=20+1054,72=20@@=20= dumpRoleMembership(PGconn=20*conn)=0A=20=09fprintf(OPF,=20"\n\n");=0A=20= }=0A=20=0A+/*=0A+=20*=20Dump=20role=20configuration=20parameter=20= privileges.=20=20This=20code=20is=20used=20for=2015.0=0A+=20*=20and=20= later=20servers.=0A+=20*=0A+=20*=20Note:=20we=20expect=20dumpRoles=20= already=20created=20all=20the=20roles,=20but=20there=20are=0A+=20*=20no=20= per-role=20configuration=20parameter=20privileges=20yet..=0A+=20*/=0A= +static=20void=0A+dumpRoleGUCPrivs(PGconn=20*conn)=0A+{=0A+=09= PQExpBuffer=20buf=20=3D=20createPQExpBuffer();=0A+=09PGresult=20=20=20= *res;=0A+=09int=09=09=09i;=0A+=0A+=09printfPQExpBuffer(buf,=20"SELECT=20= string_agg(acl.privilege_type,=20',=20'=20ORDER=20BY=20= acl.privilege_type),=20"=0A+=09=09=09=09=09=20=20"cfg.configname,=20"=0A= +=09=09=09=09=09=20=20"grantee.rolname=20AS=20grantee,=20"=0A+=09=09=09=09= =09=20=20"acl.is_grantable,=20"=0A+=09=09=09=09=09=20=20"grantor.rolname=20= AS=20grantor=20"=0A+=09=09=09=09=09=20=20"FROM=20= pg_catalog.pg_config_param=20cfg,=20"=0A+=09=09=09=09=09=20=20"LATERAL=20= (SELECT=20*=20FROM=20aclexplode(cfg.cfgacl))=20acl=20"=0A+=09=09=09=09=09= =20=20"JOIN=20pg_catalog.pg_authid=20grantee=20"=0A+=09=09=09=09=09=20=20= "ON=20acl.grantee=20=3D=20grantee.oid=20"=0A+=09=09=09=09=09=20=20"LEFT=20= JOIN=20pg_catalog.pg_authid=20grantor=20ON=20"=0A+=09=09=09=09=09=20=20= "acl.grantor=20=3D=20grantor.oid=20"=0A+=09=09=09=09=09=20=20"WHERE=20= acl.grantee=20>=200=20"=0A+=09=09=09=09=09=20=20"GROUP=20BY=20= configname,=20grantee.rolname,=20is_grantable,=20grantor.rolname"=0A+=09=09= =09=09=09=20=20);=0A+=0A+=09res=20=3D=20executeQuery(conn,=20buf->data);=0A= +=0A+=09if=20(PQntuples(res)=20>=200)=0A+=09=09fprintf(OPF,=20"--\n--=20= Role=20privileges=20on=20configuration=20parameters\n--\n\n");=0A+=0A+=09= for=20(i=20=3D=200;=20i=20<=20PQntuples(res);=20i++)=0A+=09{=0A+=09=09= char=09=20=20=20*privilege=20=3D=20PQgetvalue(res,=20i,=200);=0A+=09=09= char=09=20=20=20*cfgname=20=3D=20PQgetvalue(res,=20i,=201);=0A+=09=09= char=09=20=20=20*grantee=20=3D=20PQgetvalue(res,=20i,=202);=0A+=09=09= char=09=20=20=20*grantable=20=3D=20PQgetvalue(res,=20i,=203);=0A+=0A+=09=09= fprintf(OPF,=20"GRANT=20%s",=20privilege);=0A+=09=09fprintf(OPF,=20"=20= ON=20%s",=20cfgname);=0A+=09=09fprintf(OPF,=20"=20TO=20%s",=20= fmtId(grantee));=0A+=09=09if=20(*grantable=20=3D=3D=20't')=0A+=09=09=09= fprintf(OPF,=20"=20WITH=20GRANT=20OPTION");=0A+=0A+=09=09/*=0A+=09=09=20= *=20We=20don't=20track=20the=20grantor=20very=20carefully=20in=20the=20= backend,=20so=20cope=0A+=09=09=20*=20with=20the=20possibility=20that=20= it=20has=20been=20dropped.=0A+=09=09=20*/=0A+=09=09if=20= (!PQgetisnull(res,=20i,=204))=0A+=09=09{=0A+=09=09=09char=09=20=20=20= *grantor=20=3D=20PQgetvalue(res,=20i,=204);=0A+=0A+=09=09=09fprintf(OPF,=20= "=20GRANTED=20BY=20%s",=20fmtId(grantor));=0A+=09=09}=0A+=09=09= fprintf(OPF,=20";\n");=0A+=09}=0A+=0A+=09PQclear(res);=0A+=09= destroyPQExpBuffer(buf);=0A+=0A+=09fprintf(OPF,=20"\n\n");=0A+}=0A+=0A=20= /*=0A=20=20*=20Dump=20group=20memberships=20from=20a=20pre-8.1=20server.=20= =20It's=20annoying=20that=20we=0A=20=20*=20can't=20share=20any=20useful=20= amount=20of=20code=20with=20the=20post-8.1=20case,=20but=0Adiff=20--git=20= a/src/include/catalog/dependency.h=20b/src/include/catalog/dependency.h=0A= index=203eca295ff4..ab92782d15=20100644=0A---=20= a/src/include/catalog/dependency.h=0A+++=20= b/src/include/catalog/dependency.h=0A@@=20-92,6=20+92,7=20@@=20typedef=20= enum=20ObjectClass=0A=20=09OCLASS_TYPE,=09=09=09=09/*=20pg_type=20*/=0A=20= =09OCLASS_CAST,=09=09=09=09/*=20pg_cast=20*/=0A=20=09OCLASS_COLLATION,=09= =09=09/*=20pg_collation=20*/=0A+=09OCLASS_CONFIG_PARAM,=09=09/*=20= pg_config_param=20*/=0A=20=09OCLASS_CONSTRAINT,=09=09=09/*=20= pg_constraint=20*/=0A=20=09OCLASS_CONVERSION,=09=09=09/*=20pg_conversion=20= */=0A=20=09OCLASS_DEFAULT,=09=09=09=09/*=20pg_attrdef=20*/=0Adiff=20= --git=20a/src/include/catalog/pg_config_param.h=20= b/src/include/catalog/pg_config_param.h=0Anew=20file=20mode=20100644=0A= index=200000000000..6b92a0150e=0A---=20/dev/null=0A+++=20= b/src/include/catalog/pg_config_param.h=0A@@=20-0,0=20+1,63=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_config_param.h=0A+=20*=09=20=20definition=20of=20= the=20"configuration=20parameter"=20system=20catalog=0A+=20*=09=20=20= (pg_config_param).=0A+=20*=0A+=20*=0A+=20*=20Portions=20Copyright=20(c)=20= 1996-2021,=20PostgreSQL=20Global=20Development=20Group=0A+=20*=20= Portions=20Copyright=20(c)=201994,=20Regents=20of=20the=20University=20= of=20California=0A+=20*=0A+=20*=20src/include/catalog/pg_config_param.h=0A= +=20*=0A+=20*=20NOTES=0A+=20*=09=20=20The=20Catalog.pm=20module=20reads=20= this=20file=20and=20derives=20schema=0A+=20*=09=20=20information.=0A+=20= *=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#ifndef=20PG_CONFIG_PARAM_H=0A+#define=20PG_CONFIG_PARAM_H=0A= +=0A+#include=20"catalog/genbki.h"=0A+#include=20= "catalog/pg_config_param_d.h"=0A+=0A+/*=20----------------=0A+=20*=09=09= pg_config_param=20definition.=20=20cpp=20turns=20this=20into=0A+=20*=09=09= typedef=20struct=20FormData_pg_config_param=0A+=20*=20----------------=0A= +=20*/=0A+CATALOG(pg_config_param,8924,ConfigParamRelationId)=20= BKI_SHARED_RELATION=0A+{=0A+=09Oid=09=09=09oid;=09=09=09/*=20oid=20*/=0A= +=09/*=0A+=0A+=09=20*=20Variable-length=20fields=20start=20here,=20but=20= we=20allow=20direct=20access=20to=0A+=09=20*=20configname.=0A+=09=20*/=0A= +=09text=09=09configname=20BKI_FORCE_NOT_NULL;=0A+=0A+#ifdef=20= CATALOG_VARLEN=0A+=09/*=20Access=20privileges=20*/=0A+=09aclitem=09=09= cfgacl[1]=20BKI_DEFAULT(_null_);=0A+#endif=0A+}=20= FormData_pg_config_param;=0A+=0A+=0A+/*=20----------------=0A+=20*=09=09= Form_pg_config_param=20corresponds=20to=20a=20pointer=20to=20a=20tuple=20= with=0A+=20*=09=09the=20format=20of=20pg_config_param=20relation.=0A+=20= *=20----------------=0A+=20*/=0A+typedef=20FormData_pg_config_param=20= *Form_pg_config_param;=0A+=0A+DECLARE_TOAST(pg_config_param,=208925,=20= 8926);=0A+#define=20PgConfigParamToastTable=208925=0A+#define=20= PgConfigParamToastIndex=208926=0A+=0A= +DECLARE_UNIQUE_INDEX(pg_cfgparam_name_index,=208927,=20= ConfigParamNameIndexId,=20on=20pg_config_param=20using=20= btree(configname=20text_ops));=0A= +DECLARE_UNIQUE_INDEX_PKEY(pg_config_param_oid_index,=208928,=20= ConfigParamOidIndexId,=20on=20pg_config_param=20using=20btree(oid=20= oid_ops));=0A+=0A+extern=20Oid=09ConfigParamCreate(const=20char=20= *configname,=20bool=20if_not_exists);=0A+=0A+#endif=09=09=09=09=09=09=09= /*=20PG_CONFIG_PARAM_H=20*/=0Adiff=20--git=20= a/src/include/catalog/pg_default_acl.h=20= b/src/include/catalog/pg_default_acl.h=0Aindex=20eb72dd6293..4ca71b2258=20= 100644=0A---=20a/src/include/catalog/pg_default_acl.h=0A+++=20= b/src/include/catalog/pg_default_acl.h=0A@@=20-66,6=20+66,7=20@@=20= DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index,=20828,=20= DefaultAclOidIndexId,=20o=0A=20#define=20DEFACLOBJ_FUNCTION=09=09'f'=20= /*=20function=20*/=0A=20#define=20DEFACLOBJ_TYPE=09=09=09'T'=20/*=20type=20= */=0A=20#define=20DEFACLOBJ_NAMESPACE=09=09'n'=20/*=20namespace=20*/=0A= +#define=20DEFACLOBJ_CONFIG_PARAM=09'c'=20/*=20configuration=20parameter=20= */=0A=20=0A=20#endif=09=09=09=09=09=09=09/*=20EXPOSE_TO_CLIENT_CODE=20*/=0A= =20=0Adiff=20--git=20a/src/include/nodes/parsenodes.h=20= b/src/include/nodes/parsenodes.h=0Aindex=20067138e6b5..f717c6d024=20= 100644=0A---=20a/src/include/nodes/parsenodes.h=0A+++=20= b/src/include/nodes/parsenodes.h=0A@@=20-92,7=20+92,9=20@@=20typedef=20= uint32=20AclMode;=09=09=09/*=20a=20bitmask=20of=20privilege=20bits=20*/=0A= =20#define=20ACL_CREATE=09=09(1<<9)=09/*=20for=20namespaces=20and=20= databases=20*/=0A=20#define=20ACL_CREATE_TEMP=20(1<<10)=20/*=20for=20= databases=20*/=0A=20#define=20ACL_CONNECT=09=09(1<<11)=20/*=20for=20= databases=20*/=0A-#define=20N_ACL_RIGHTS=0912=09=09/*=201=20plus=20the=20= last=201<=20{=20pg_dumpall_globals=20=3D>=201,=20= },=0A=20=09},=0A=20=0A+=09'GRANT=20ALTER=20SYSTEM=20ON=20= ignore_checksum_failure'=20=3D>=20{=0A+=09=09create_order=20=3D>=202,=0A= +=09=09create_sql=20=20=20=3D>=0A+=09=09=09'GRANT=20ALTER=20SYSTEM=20ON=20= ignore_checksum_failure=20TO=20regress_dump_test_role;',=0A+=09=09regexp=20= =20=20=20=20=20=20=3D>=0A+=09=09=09qr/^GRANT=20ALTER=20SYSTEM=20ON=20= ignore_checksum_failure=20TO=20regress_dump_test_role=20GRANTED=20BY=20= /m,=0A+=09=09like=20=20=20=20=20=20=20=20=20=3D>=20{=20= pg_dumpall_globals=20=3D>=201,=20},=0A+=09},=0A+=0A+=09'GRANT=20SET=20= VALUE=20ON=20my.missing.guc'=20=3D>=20{=0A+=09=09create_order=20=3D>=20= 2,=0A+=09=09create_sql=20=20=20=3D>=0A+=09=09=09'GRANT=20SET=20VALUE=20= ON=20my.missing.guc=20TO=20regress_dump_test_role;',=0A+=09=09regexp=20=20= =20=20=20=20=20=3D>=0A+=09=09=09qr/^GRANT=20SET=20VALUE=20ON=20= my\.missing\.guc=20TO=20regress_dump_test_role=20GRANTED=20BY=20/m,=0A+=09= =09like=20=20=20=20=20=20=20=20=20=3D>=20{=20pg_dumpall_globals=20=3D>=20= 1,=20},=0A+=09},=0A+=0A+=09'GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20= something=20WITH=20GRANT=20OPTION'=20=3D>=20{=0A+=09=09create_order=20=3D>= =202,=0A+=09=09create_sql=20=3D>=0A+=09=09=09'GRANT=20SET=20VALUE,=20= ALTER=20SYSTEM=20ON=20something=20TO=20regress_dump_test_role=20WITH=20= GRANT=20OPTION;',=0A+=09=09regexp=20=3D>=0A+=09=09=09qr/^GRANT=20ALTER=20= SYSTEM,=20SET=20VALUE=20ON=20something=20TO=20regress_dump_test_role=20= WITH=20GRANT=20OPTION=20GRANTED=20BY=20/m,=0A+=09=09like=20=3D>=20{=20= pg_dumpall_globals=20=3D>=201,=20},=0A+=09},=0A+=0A+=09'GRANT=20ALTER=20= SYSTEM=20ON=20= MyReallyLong.ButValidCustom.GucNameThatCannotFit.InNamedata64Byte.Format'=20= =3D>=20{=0A+=09=09create_order=20=3D>=202,=0A+=09=09create_sql=20=3D>=0A= +=09=09=09#=20configuration=20parameters=20get=20cased=20folded=0A+=09=09= =09'GRANT=20ALTER=20SYSTEM=20ON=20= MyReallyLong.ButValidCustom.GucNameThatCannotFit.InNamedata64Byte.Format=20= TO=20regress_dump_test_role;',=0A+=09=09regexp=20=3D>=0A+=09=09=09= qr/^GRANT=20ALTER=20SYSTEM=20ON=20= myreallylong\.butvalidcustom\.gucnamethatcannotfit\.innamedata64byte\.form= at=20TO=20regress_dump_test_role=20GRANTED=20BY=20/m,=0A+=09=09like=20=3D>= =20{=20pg_dumpall_globals=20=3D>=201,=20},=0A+=09},=0A+=0A+=09'GRANT=20= ALTER=20SYSTEM,=20SET=20VALUE=20ON=20my.guc=20TO=20= regress_dump_test_role=20GRANTED=20BY=20CURRENT_ROLE'=20=3D>=20{=0A+=09=09= create_order=20=3D>=202,=0A+=09=09create_sql=20=3D>=0A+=09=09=09#=20= GRANTED=20BY=20CURRENT_ROLE=20is=20allowed=20for=20SQL=20compatibility,=20= but=20is=20ignored=0A+=09=09=09'GRANT=20ALTER=20SYSTEM,=20SET=20VALUE=20= ON=20my.guc=20TO=20regress_dump_test_role=20GRANTED=20BY=20= CURRENT_ROLE;',=0A+=09=09regexp=20=3D>=0A+=09=09=09qr/^GRANT=20ALTER=20= SYSTEM,=20SET=20VALUE=20ON=20my\.guc=20TO=20regress_dump_test_role=20= GRANTED=20BY=20/m,=0A+=09=09like=20=3D>=20{=20pg_dumpall_globals=20=3D>=20= 1,=20},=0A+=09},=0A+=0A=20=09'CREATE=20SCHEMA=20public'=20=3D>=20{=0A=20=09= =09regexp=20=3D>=20qr/^CREATE=20SCHEMA=20public;/m,=0A=20=09=09like=20=20= =20=3D>=20{=0Adiff=20--git=20a/src/test/regress/expected/guc_privs.out=20= b/src/test/regress/expected/guc_privs.out=0Anew=20file=20mode=20100644=0A= index=200000000000..ae02b3fe77=0A---=20/dev/null=0A+++=20= b/src/test/regress/expected/guc_privs.out=0A@@=20-0,0=20+1,204=20@@=0A= +--=20Test=20superuser=0A+--=20Superuser=20DBA=0A+CREATE=20ROLE=20= regress_admin=20SUPERUSER;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_admin;=0A+--=20PGC_BACKEND=0A+SET=20ignore_system_indexes=20=3D=20= OFF;=20=20--=20fail,=20cannot=20be=20set=20after=20connection=20start=0A= +ERROR:=20=20parameter=20"ignore_system_indexes"=20cannot=20be=20set=20= after=20connection=20start=0A+RESET=20ignore_system_indexes;=20=20--=20= fail,=20cannot=20be=20set=20after=20connection=20start=0A+ERROR:=20=20= parameter=20"ignore_system_indexes"=20cannot=20be=20set=20after=20= connection=20start=0A+ALTER=20SYSTEM=20SET=20ignore_system_indexes=20=3D=20= OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20ignore_system_indexes;=20=20= --=20ok=0A+--=20PGC_INTERNAL=0A+SET=20block_size=20=3D=2050;=20=20--=20= fail,=20cannot=20be=20changed=0A+ERROR:=20=20parameter=20"block_size"=20= cannot=20be=20changed=0A+RESET=20block_size;=20=20--=20fail,=20cannot=20= be=20changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20be=20= changed=0A+ALTER=20SYSTEM=20SET=20block_size=20=3D=2050;=20=20--=20fail,=20= cannot=20be=20changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20= be=20changed=0A+ALTER=20SYSTEM=20RESET=20block_size;=20=20--=20fail,=20= cannot=20be=20changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20= be=20changed=0A+--=20PGC_POSTMASTER=0A+SET=20autovacuum_freeze_max_age=20= =3D=201000050000;=20=20--=20fail,=20requires=20restart=0A+ERROR:=20=20= parameter=20"autovacuum_freeze_max_age"=20cannot=20be=20changed=20= without=20restarting=20the=20server=0A+RESET=20= autovacuum_freeze_max_age;=20=20--=20fail,=20requires=20restart=0A= +ERROR:=20=20parameter=20"autovacuum_freeze_max_age"=20cannot=20be=20= changed=20without=20restarting=20the=20server=0A+ALTER=20SYSTEM=20SET=20= autovacuum_freeze_max_age=20=3D=201000050000;=20=20--=20ok=0A+ALTER=20= SYSTEM=20RESET=20autovacuum_freeze_max_age;=20=20--=20ok=0A+ALTER=20= SYSTEM=20SET=20config_file=20=3D=20'/usr/local/data/postgresql.conf';=20=20= --=20fail,=20cannot=20be=20changed=0A+ERROR:=20=20parameter=20= "config_file"=20cannot=20be=20changed=0A+ALTER=20SYSTEM=20RESET=20= config_file;=20=20--=20fail,=20cannot=20be=20changed=0A+ERROR:=20=20= parameter=20"config_file"=20cannot=20be=20changed=0A+--=20PGC_SIGHUP=0A= +SET=20autovacuum=20=3D=20OFF;=20=20--=20fail,=20requires=20reload=0A= +ERROR:=20=20parameter=20"autovacuum"=20cannot=20be=20changed=20now=0A= +RESET=20autovacuum;=20=20--=20fail,=20requires=20reload=0A+ERROR:=20=20= parameter=20"autovacuum"=20cannot=20be=20changed=20now=0A+ALTER=20SYSTEM=20= SET=20autovacuum=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20= autovacuum;=20=20--=20ok=0A+--=20PGC_SUSET=0A+SET=20lc_messages=20=3D=20= 'en_US.UTF-8';=20=20--=20ok=0A+RESET=20lc_messages;=20=20--=20ok=0A= +ALTER=20SYSTEM=20SET=20lc_messages=20=3D=20'en_US.UTF-8';=20=20--=20ok=0A= +ALTER=20SYSTEM=20RESET=20lc_messages;=20=20--=20ok=0A+--=20= PGC_SU_BACKEND=0A+SET=20jit_debugging_support=20=3D=20OFF;=20=20--=20= fail,=20cannot=20be=20set=20after=20connection=20start=0A+ERROR:=20=20= parameter=20"jit_debugging_support"=20cannot=20be=20set=20after=20= connection=20start=0A+RESET=20jit_debugging_support;=20=20--=20fail,=20= cannot=20be=20set=20after=20connection=20start=0A+ERROR:=20=20parameter=20= "jit_debugging_support"=20cannot=20be=20set=20after=20connection=20start=0A= +ALTER=20SYSTEM=20SET=20jit_debugging_support=20=3D=20OFF;=20=20--=20ok=0A= +ALTER=20SYSTEM=20RESET=20jit_debugging_support;=20=20--=20ok=0A+--=20= PGC_USERSET=0A+SET=20DateStyle=20=3D=20'ISO,=20MDY';=20=20--=20ok=0A= +RESET=20DateStyle;=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20DateStyle=20=3D= =20'ISO,=20MDY';=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20DateStyle;=20=20= --=20ok=0A+ALTER=20SYSTEM=20SET=20ssl_renegotiation_limit=20=3D=200;=20=20= --=20fail,=20cannot=20be=20changed=0A+ERROR:=20=20parameter=20= "ssl_renegotiation_limit"=20cannot=20be=20changed=0A+ALTER=20SYSTEM=20= RESET=20ssl_renegotiation_limit;=20=20--=20fail,=20cannot=20be=20changed=0A= +ERROR:=20=20parameter=20"ssl_renegotiation_limit"=20cannot=20be=20= changed=0A+--=20Finished=20testing=20superuser=0A+RESET=20= statement_timeout;=0A+RESET=20SESSION=20AUTHORIZATION;=0A+DROP=20ROLE=20= regress_admin;=0A+--=20Create=20non-superuser=20with=20privileges=20to=20= configure=20host=20resource=20usage=0A+CREATE=20ROLE=20= regress_host_resource_admin=20NOSUPERUSER;=0A+GRANT=20SET=20VALUE,=20= ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20hash_mem_multiplier,=20= logical_decoding_work_mem,=0A+=09maintenance_work_mem,=20= max_stack_depth,=20min_dynamic_shared_memory,=0A+=09shared_buffers,=20= temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_host_resource_admin'=20--=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20privileges=20have=20been=20= granted=0A+ALTER=20SYSTEM=20SET=20ignore_system_indexes=20=3D=20OFF;=20=20= --=20fail,=20insufficient=20privileges=0A+ERROR:=20=20permission=20= denied=20to=20set=20parameter=20"ignore_system_indexes"=0A+ALTER=20= SYSTEM=20RESET=20autovacuum_multixact_freeze_max_age;=20=20--=20fail,=20= insufficient=20privileges=0A+ERROR:=20=20permission=20denied=20to=20set=20= parameter=20"autovacuum_multixact_freeze_max_age"=0A+SET=20jit_provider=20= =3D=20'llvmjit';=20=20--=20fail,=20insufficient=20privileges=0A+ERROR:=20= =20parameter=20"jit_provider"=20cannot=20be=20changed=20without=20= restarting=20the=20server=0A+ALTER=20SYSTEM=20SET=20shared_buffers=20=3D=20= 50;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20shared_buffers;=20=20--=20= ok=0A+SET=20autovacuum_work_mem=20=3D=2050;=20=20--=20cannot=20be=20= changed=20now=0A+ERROR:=20=20parameter=20"autovacuum_work_mem"=20cannot=20= be=20changed=20now=0A+ALTER=20SYSTEM=20RESET=20temp_file_limit;=20=20--=20= ok=0A+SET=20TimeZone=20=3D=20'Europe/Helsinki';=20=20--=20ok=0A+ALTER=20= SYSTEM=20RESET=20autovacuum_work_mem;=20=20--=20ok,=20privileges=20have=20= been=20granted=0A+RESET=20TimeZone;=20=20--=20ok=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20= fail,=20privileges=20remain=0A+ERROR:=20=20role=20= "regress_host_resource_admin"=20cannot=20be=20dropped=20because=20some=20= objects=20depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20= configuration=20parameter=20work_mem=0A+privileges=20for=20configuration=20= parameter=20maintenance_work_mem=0A+privileges=20for=20configuration=20= parameter=20autovacuum_work_mem=0A+privileges=20for=20configuration=20= parameter=20hash_mem_multiplier=0A+privileges=20for=20configuration=20= parameter=20logical_decoding_work_mem=0A+privileges=20for=20= configuration=20parameter=20max_stack_depth=0A+privileges=20for=20= configuration=20parameter=20min_dynamic_shared_memory=0A+privileges=20= for=20configuration=20parameter=20shared_buffers=0A+privileges=20for=20= configuration=20parameter=20temp_buffers=0A+privileges=20for=20= configuration=20parameter=20temp_file_limit=0A+--=20Use=20"revoke"=20to=20= remove=20the=20privileges=20and=20allow=20the=20role=20to=20be=20dropped=0A= +REVOKE=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A= +FROM=20regress_host_resource_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20ok=0A+--=20Try=20that=20again,=20= but=20use=20"drop=20owned=20by"=20instead=20of=20"revoke"=0A+CREATE=20= ROLE=20regress_host_resource_admin=20NOSUPERUSER;=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20fail,=20privileges=20not=20yet=20= granted=0A+ERROR:=20=20permission=20denied=20to=20set=20parameter=20= "autovacuum_work_mem"=0A+RESET=20SESSION=20AUTHORIZATION;=0A+GRANT=20SET=20= VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20fail,=20privileges=20remain=0A= +ERROR:=20=20role=20"regress_host_resource_admin"=20cannot=20be=20= dropped=20because=20some=20objects=20depend=20on=20it=0A+DETAIL:=20=20= privileges=20for=20configuration=20parameter=20work_mem=0A+privileges=20= for=20configuration=20parameter=20maintenance_work_mem=0A+privileges=20= for=20configuration=20parameter=20autovacuum_work_mem=0A+privileges=20= for=20configuration=20parameter=20hash_mem_multiplier=0A+privileges=20= for=20configuration=20parameter=20logical_decoding_work_mem=0A= +privileges=20for=20configuration=20parameter=20max_stack_depth=0A= +privileges=20for=20configuration=20parameter=20= min_dynamic_shared_memory=0A+privileges=20for=20configuration=20= parameter=20shared_buffers=0A+privileges=20for=20configuration=20= parameter=20temp_buffers=0A+privileges=20for=20configuration=20parameter=20= temp_file_limit=0A+DROP=20OWNED=20BY=20regress_host_resource_admin=20= RESTRICT;=20--=20cascade=20should=20not=20be=20needed=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20fail,=20"drop=20owned"=20has=20= dropped=20privileges=0A+ERROR:=20=20permission=20denied=20to=20set=20= parameter=20"autovacuum_work_mem"=0A+RESET=20SESSION=20AUTHORIZATION;=0A= +DROP=20ROLE=20regress_host_resource_admin;=20=20--=20ok=0A+--=20Try=20= that=20again,=20but=20use=20"reassign=20owned=20by"=20this=20time=0A= +CREATE=20ROLE=20regress_host_resource_admin=20NOSUPERUSER;=0A+CREATE=20= ROLE=20regress_host_resource_newadmin=20NOSUPERUSER;=0A+GRANT=20SET=20= VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+REASSIGN=20OWNED=20BY=20= regress_host_resource_admin=20TO=20regress_host_resource_newadmin;=0A= +SET=20SESSION=20AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20= SYSTEM=20SET=20autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20"reassign=20= owned"=20did=20not=20change=20privileges=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20= fail,=20privileges=20remain=0A+ERROR:=20=20role=20= "regress_host_resource_admin"=20cannot=20be=20dropped=20because=20some=20= objects=20depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20= configuration=20parameter=20work_mem=0A+privileges=20for=20configuration=20= parameter=20maintenance_work_mem=0A+privileges=20for=20configuration=20= parameter=20autovacuum_work_mem=0A+privileges=20for=20configuration=20= parameter=20hash_mem_multiplier=0A+privileges=20for=20configuration=20= parameter=20logical_decoding_work_mem=0A+privileges=20for=20= configuration=20parameter=20max_stack_depth=0A+privileges=20for=20= configuration=20parameter=20min_dynamic_shared_memory=0A+privileges=20= for=20configuration=20parameter=20shared_buffers=0A+privileges=20for=20= configuration=20parameter=20temp_buffers=0A+privileges=20for=20= configuration=20parameter=20temp_file_limit=0A+DROP=20ROLE=20= regress_host_resource_newadmin;=20=20--=20ok,=20nothing=20was=20= transferred=0A+--=20Use=20"drop=20owned=20by"=20so=20we=20can=20drop=20= the=20role=0A+DROP=20OWNED=20BY=20regress_host_resource_admin;=20=20--=20= ok=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20ok=0A+--=20= Create=20non-superuser=20with=20privileges=20to=20configure=20plgsql=20= custom=20variables=0A+CREATE=20ROLE=20regress_plpgsql_admin=20= NOSUPERUSER;=0A+--=20Perform=20all=20operations=20as=20user=20= 'regress_plpgsql_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_plpgsql_admin;=0A+SET=20plpgsql.extra_errors=20TO=20'all';=0A= +SET=20plpgsql.extra_warnings=20TO=20'all';=0A+RESET=20= plpgsql.extra_errors;=0A+RESET=20plpgsql.extra_warnings;=0A+ALTER=20= SYSTEM=20SET=20plpgsql.extra_errors=20TO=20'all';=0A+ERROR:=20=20= permission=20denied=20to=20set=20parameter=20"plpgsql.extra_errors"=0A= +ALTER=20SYSTEM=20SET=20plpgsql.extra_warnings=20TO=20'all';=0A+ERROR:=20= =20permission=20denied=20to=20set=20parameter=20"plpgsql.extra_warnings"=0A= +ALTER=20SYSTEM=20RESET=20plpgsql.extra_errors;=0A+ERROR:=20=20= permission=20denied=20to=20set=20parameter=20"plpgsql.extra_errors"=0A= +ALTER=20SYSTEM=20RESET=20plpgsql.extra_warnings;=0A+ERROR:=20=20= permission=20denied=20to=20set=20parameter=20"plpgsql.extra_warnings"=0A= +RESET=20SESSION=20AUTHORIZATION;=0A+GRANT=20SET=20VALUE,=20ALTER=20= SYSTEM=20ON=0A+=09plpgsql.extra_warnings,=20plpgsql.extra_errors=0A+TO=20= regress_plpgsql_admin;=0A+--=20Perform=20all=20operations=20as=20user=20= 'regress_plpgsql_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_plpgsql_admin;=20=20--=20ok=0A+SET=20plpgsql.extra_errors=20TO=20= 'all';=20=20--=20ok=0A+SET=20plpgsql.extra_warnings=20TO=20'all';=20=20= --=20ok=0A+RESET=20plpgsql.extra_errors;=20=20--=20ok=0A+RESET=20= plpgsql.extra_warnings;=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20= plpgsql.extra_errors=20TO=20'all';=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20= plpgsql.extra_warnings=20TO=20'all';=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20plpgsql.extra_errors;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20= plpgsql.extra_warnings;=20=20--=20ok=0A+RESET=20SESSION=20AUTHORIZATION;=0A= +DROP=20ROLE=20regress_plpgsql_admin;=20=20--=20fail,=20privileges=20= remain=0A+ERROR:=20=20role=20"regress_plpgsql_admin"=20cannot=20be=20= dropped=20because=20some=20objects=20depend=20on=20it=0A+DETAIL:=20=20= privileges=20for=20configuration=20parameter=20plpgsql.extra_warnings=0A= +privileges=20for=20configuration=20parameter=20plpgsql.extra_errors=0A= +REVOKE=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09= plpgsql.extra_warnings,=20plpgsql.extra_errors=0A+FROM=20= regress_plpgsql_admin;=0A+DROP=20ROLE=20regress_plpgsql_admin;=20=20--=20= ok=0Adiff=20--git=20a/src/test/regress/expected/privileges.out=20= b/src/test/regress/expected/privileges.out=0Aindex=20= 9b91865dcc..ef4197c0f3=20100644=0A---=20= a/src/test/regress/expected/privileges.out=0A+++=20= b/src/test/regress/expected/privileges.out=0A@@=20-31,6=20+31,34=20@@=20= CREATE=20USER=20regress_priv_user6;=0A=20CREATE=20USER=20= regress_priv_user7;=0A=20GRANT=20pg_read_all_data=20TO=20= regress_priv_user6;=0A=20GRANT=20pg_write_all_data=20TO=20= regress_priv_user7;=0A+GRANT=20SET=20VALUE=20ON=20enable_memoize=20TO=20= regress_priv_user6;=0A+GRANT=20SET=20VALUE=20ON=20enable_nestloop=20TO=20= regress_priv_user6;=0A+SET=20ROLE=20regress_priv_user6;=0A+SET=20= enable_memoize=20TO=20false;=0A+SET=20enable_nestloop=20TO=20false;=0A= +RESET=20enable_memoize;=0A+RESET=20enable_nestloop;=0A+RESET=20ROLE;=0A= +GRANT=20ALTER=20SYSTEM=20ON=20enable_seqscan=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20sort_mem=20TO=20= regress_priv_user7;=20--=20old=20name=20for=20"work_mem"=0A+NOTICE:=20=20= granting=20privileges=20on=20canonical=20configuration=20parameter=20= name=20"work_mem"=0A+GRANT=20ALTER=20SYSTEM=20ON=20maintenance_work_mem=20= TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20= no_such_param=20TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20= SYSTEM=20ON=20no_such_extension.no_such_param=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20""=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+ERROR:=20=20zero-length=20= delimited=20identifier=20at=20or=20near=20""""=0A+LINE=201:=20GRANT=20= ALTER=20SYSTEM=20ON=20""=20TO=20regress_priv_user7;=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ^=0A+GRANT=20ALTER=20SYSTEM=20ON=20"=20"=20TO=20regress_priv_user7;=20--=20= bad=20name=0A+ERROR:=20=20invalid=20configuration=20parameter=20name=20"=20= "=0A+GRANT=20ALTER=20SYSTEM=20ON=20"=20foo=20"=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+ERROR:=20=20invalid=20= configuration=20parameter=20name=20"=20foo=20"=0A+GRANT=20SELECT=20ON=20= public.persons2=20TO=20regress_priv_user7;=0A+SET=20ROLE=20= regress_priv_user7;=0A+ALTER=20SYSTEM=20SET=20enable_seqscan=20=3D=20= OFF;=0A+ALTER=20SYSTEM=20RESET=20enable_seqscan;=0A+RESET=20ROLE;=0A=20= CREATE=20GROUP=20regress_priv_group1;=0A=20CREATE=20GROUP=20= regress_priv_group2=20WITH=20USER=20regress_priv_user1,=20= regress_priv_user2;=0A=20ALTER=20GROUP=20regress_priv_group1=20ADD=20= USER=20regress_priv_user4;=0A@@=20-2326,10=20+2354,32=20@@=20DROP=20USER=20= regress_priv_user2;=0A=20DROP=20USER=20regress_priv_user3;=0A=20DROP=20= USER=20regress_priv_user4;=0A=20DROP=20USER=20regress_priv_user5;=0A= -DROP=20USER=20regress_priv_user6;=0A-DROP=20USER=20regress_priv_user7;=0A= +DROP=20USER=20regress_priv_user6;=20--=20privileges=20remain=0A+ERROR:=20= =20role=20"regress_priv_user6"=20cannot=20be=20dropped=20because=20some=20= objects=20depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20= configuration=20parameter=20enable_memoize=0A+privileges=20for=20= configuration=20parameter=20enable_nestloop=0A+DROP=20USER=20= regress_priv_user7;=20--=20privileges=20remain=0A+ERROR:=20=20role=20= "regress_priv_user7"=20cannot=20be=20dropped=20because=20some=20objects=20= depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20table=20persons2=0A= +privileges=20for=20configuration=20parameter=20enable_seqscan=0A= +privileges=20for=20configuration=20parameter=20work_mem=0A+privileges=20= for=20configuration=20parameter=20maintenance_work_mem=0A+privileges=20= for=20configuration=20parameter=20no_such_param=0A+privileges=20for=20= configuration=20parameter=20no_such_extension.no_such_param=0A= +privileges=20for=20configuration=20parameter=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=0A=20= DROP=20USER=20regress_priv_user8;=20--=20does=20not=20exist=0A=20ERROR:=20= =20role=20"regress_priv_user8"=20does=20not=20exist=0A+REVOKE=20SELECT=20= ON=20public.persons2=20FROM=20regress_priv_user7;=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20ok=0A= +REVOKE=20ALTER=20SYSTEM=20ON=20work_mem=20FROM=20regress_priv_user7;=20= --=20ok,=20use=20new=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20vacuum_mem=20= FROM=20regress_priv_user7;=20--=20ok,=20use=20old=20name=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20no_such_param=20FROM=20regress_priv_user7;=20--=20= ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20no_such_extension.no_such_param=20= FROM=20regress_priv_user7;=20--=20ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20= FROM=20regress_priv_user7;=20--=20ok=0A+DROP=20USER=20= regress_priv_user7;=20--=20ok=0A+REVOKE=20SET=20VALUE=20ON=20= enable_memoize=20FROM=20regress_priv_user6;=0A+REVOKE=20SET=20VALUE=20ON=20= enable_nestloop=20FROM=20regress_priv_user6;=0A+DROP=20USER=20= regress_priv_user6;=20--=20ok=0A=20--=20permissions=20with=20LOCK=20= TABLE=0A=20CREATE=20USER=20regress_locktable_user;=0A=20CREATE=20TABLE=20= lock_table=20(a=20int);=0Adiff=20--git=20= a/src/test/regress/expected/sanity_check.out=20= b/src/test/regress/expected/sanity_check.out=0Aindex=20= 63706a28cc..aff31f0d24=20100644=0A---=20= a/src/test/regress/expected/sanity_check.out=0A+++=20= b/src/test/regress/expected/sanity_check.out=0A@@=20-113,6=20+113,7=20@@=20= pg_authid|t=0A=20pg_cast|t=0A=20pg_class|t=0A=20pg_collation|t=0A= +pg_config_param|t=0A=20pg_constraint|t=0A=20pg_conversion|t=0A=20= pg_database|t=0Adiff=20--git=20a/src/test/regress/parallel_schedule=20= b/src/test/regress/parallel_schedule=0Aindex=20017e962fed..b45a203eb6=20= 100644=0A---=20a/src/test/regress/parallel_schedule=0A+++=20= b/src/test/regress/parallel_schedule=0A@@=20-86,7=20+86,7=20@@=20test:=20= brin_bloom=20brin_multi=0A=20#=20----------=0A=20#=20Another=20group=20= of=20parallel=20tests=0A=20#=20----------=0A-test:=20create_table_like=20= alter_generic=20alter_operator=20misc=20async=20dbsize=20misc_functions=20= sysviews=20tsrf=20tid=20tidscan=20tidrangescan=20collate.icu.utf8=20= incremental_sort=0A+test:=20create_table_like=20alter_generic=20= alter_operator=20misc=20async=20dbsize=20misc_functions=20sysviews=20= tsrf=20tid=20tidscan=20tidrangescan=20collate.icu.utf8=20= incremental_sort=20guc_privs=0A=20=0A=20#=20rules=20cannot=20run=20= concurrently=20with=20any=20test=20that=20creates=0A=20#=20a=20view=20or=20= rule=20in=20the=20public=20schema=0Adiff=20--git=20= a/src/test/regress/sql/guc_privs.sql=20= b/src/test/regress/sql/guc_privs.sql=0Anew=20file=20mode=20100644=0A= index=200000000000..e5dbc7ad3b=0A---=20/dev/null=0A+++=20= b/src/test/regress/sql/guc_privs.sql=0A@@=20-0,0=20+1,142=20@@=0A+--=20= Test=20superuser=0A+--=20Superuser=20DBA=0A+CREATE=20ROLE=20= regress_admin=20SUPERUSER;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_admin;=0A+--=20PGC_BACKEND=0A+SET=20ignore_system_indexes=20=3D=20= OFF;=20=20--=20fail,=20cannot=20be=20set=20after=20connection=20start=0A= +RESET=20ignore_system_indexes;=20=20--=20fail,=20cannot=20be=20set=20= after=20connection=20start=0A+ALTER=20SYSTEM=20SET=20= ignore_system_indexes=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20ignore_system_indexes;=20=20--=20ok=0A+--=20PGC_INTERNAL=0A+SET=20= block_size=20=3D=2050;=20=20--=20fail,=20cannot=20be=20changed=0A+RESET=20= block_size;=20=20--=20fail,=20cannot=20be=20changed=0A+ALTER=20SYSTEM=20= SET=20block_size=20=3D=2050;=20=20--=20fail,=20cannot=20be=20changed=0A= +ALTER=20SYSTEM=20RESET=20block_size;=20=20--=20fail,=20cannot=20be=20= changed=0A+--=20PGC_POSTMASTER=0A+SET=20autovacuum_freeze_max_age=20=3D=20= 1000050000;=20=20--=20fail,=20requires=20restart=0A+RESET=20= autovacuum_freeze_max_age;=20=20--=20fail,=20requires=20restart=0A+ALTER=20= SYSTEM=20SET=20autovacuum_freeze_max_age=20=3D=201000050000;=20=20--=20= ok=0A+ALTER=20SYSTEM=20RESET=20autovacuum_freeze_max_age;=20=20--=20ok=0A= +ALTER=20SYSTEM=20SET=20config_file=20=3D=20= '/usr/local/data/postgresql.conf';=20=20--=20fail,=20cannot=20be=20= changed=0A+ALTER=20SYSTEM=20RESET=20config_file;=20=20--=20fail,=20= cannot=20be=20changed=0A+--=20PGC_SIGHUP=0A+SET=20autovacuum=20=3D=20= OFF;=20=20--=20fail,=20requires=20reload=0A+RESET=20autovacuum;=20=20--=20= fail,=20requires=20reload=0A+ALTER=20SYSTEM=20SET=20autovacuum=20=3D=20= OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20autovacuum;=20=20--=20ok=0A= +--=20PGC_SUSET=0A+SET=20lc_messages=20=3D=20'en_US.UTF-8';=20=20--=20ok=0A= +RESET=20lc_messages;=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20lc_messages=20= =3D=20'en_US.UTF-8';=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20= lc_messages;=20=20--=20ok=0A+--=20PGC_SU_BACKEND=0A+SET=20= jit_debugging_support=20=3D=20OFF;=20=20--=20fail,=20cannot=20be=20set=20= after=20connection=20start=0A+RESET=20jit_debugging_support;=20=20--=20= fail,=20cannot=20be=20set=20after=20connection=20start=0A+ALTER=20SYSTEM=20= SET=20jit_debugging_support=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20jit_debugging_support;=20=20--=20ok=0A+--=20PGC_USERSET=0A+SET=20= DateStyle=20=3D=20'ISO,=20MDY';=20=20--=20ok=0A+RESET=20DateStyle;=20=20= --=20ok=0A+ALTER=20SYSTEM=20SET=20DateStyle=20=3D=20'ISO,=20MDY';=20=20= --=20ok=0A+ALTER=20SYSTEM=20RESET=20DateStyle;=20=20--=20ok=0A+ALTER=20= SYSTEM=20SET=20ssl_renegotiation_limit=20=3D=200;=20=20--=20fail,=20= cannot=20be=20changed=0A+ALTER=20SYSTEM=20RESET=20= ssl_renegotiation_limit;=20=20--=20fail,=20cannot=20be=20changed=0A+--=20= Finished=20testing=20superuser=0A+RESET=20statement_timeout;=0A+RESET=20= SESSION=20AUTHORIZATION;=0A+DROP=20ROLE=20regress_admin;=0A+--=20Create=20= non-superuser=20with=20privileges=20to=20configure=20host=20resource=20= usage=0A+CREATE=20ROLE=20regress_host_resource_admin=20NOSUPERUSER;=0A= +GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_host_resource_admin'=20--=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20privileges=20have=20been=20= granted=0A+ALTER=20SYSTEM=20SET=20ignore_system_indexes=20=3D=20OFF;=20=20= --=20fail,=20insufficient=20privileges=0A+ALTER=20SYSTEM=20RESET=20= autovacuum_multixact_freeze_max_age;=20=20--=20fail,=20insufficient=20= privileges=0A+SET=20jit_provider=20=3D=20'llvmjit';=20=20--=20fail,=20= insufficient=20privileges=0A+ALTER=20SYSTEM=20SET=20shared_buffers=20=3D=20= 50;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20shared_buffers;=20=20--=20= ok=0A+SET=20autovacuum_work_mem=20=3D=2050;=20=20--=20cannot=20be=20= changed=20now=0A+ALTER=20SYSTEM=20RESET=20temp_file_limit;=20=20--=20ok=0A= +SET=20TimeZone=20=3D=20'Europe/Helsinki';=20=20--=20ok=0A+ALTER=20= SYSTEM=20RESET=20autovacuum_work_mem;=20=20--=20ok,=20privileges=20have=20= been=20granted=0A+RESET=20TimeZone;=20=20--=20ok=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20= fail,=20privileges=20remain=0A+--=20Use=20"revoke"=20to=20remove=20the=20= privileges=20and=20allow=20the=20role=20to=20be=20dropped=0A+REVOKE=20= SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A= +FROM=20regress_host_resource_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20ok=0A+--=20Try=20that=20again,=20= but=20use=20"drop=20owned=20by"=20instead=20of=20"revoke"=0A+CREATE=20= ROLE=20regress_host_resource_admin=20NOSUPERUSER;=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20fail,=20privileges=20not=20yet=20= granted=0A+RESET=20SESSION=20AUTHORIZATION;=0A+GRANT=20SET=20VALUE,=20= ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20hash_mem_multiplier,=20= logical_decoding_work_mem,=0A+=09maintenance_work_mem,=20= max_stack_depth,=20min_dynamic_shared_memory,=0A+=09shared_buffers,=20= temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20fail,=20privileges=20remain=0A= +DROP=20OWNED=20BY=20regress_host_resource_admin=20RESTRICT;=20--=20= cascade=20should=20not=20be=20needed=0A+SET=20SESSION=20AUTHORIZATION=20= regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20fail,=20"drop=20owned"=20has=20= dropped=20privileges=0A+RESET=20SESSION=20AUTHORIZATION;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20ok=0A+--=20Try=20that=20again,=20= but=20use=20"reassign=20owned=20by"=20this=20time=0A+CREATE=20ROLE=20= regress_host_resource_admin=20NOSUPERUSER;=0A+CREATE=20ROLE=20= regress_host_resource_newadmin=20NOSUPERUSER;=0A+GRANT=20SET=20VALUE,=20= ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20hash_mem_multiplier,=20= logical_decoding_work_mem,=0A+=09maintenance_work_mem,=20= max_stack_depth,=20min_dynamic_shared_memory,=0A+=09shared_buffers,=20= temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+REASSIGN=20OWNED=20BY=20= regress_host_resource_admin=20TO=20regress_host_resource_newadmin;=0A= +SET=20SESSION=20AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20= SYSTEM=20SET=20autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20"reassign=20= owned"=20did=20not=20change=20privileges=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20= fail,=20privileges=20remain=0A+DROP=20ROLE=20= regress_host_resource_newadmin;=20=20--=20ok,=20nothing=20was=20= transferred=0A+--=20Use=20"drop=20owned=20by"=20so=20we=20can=20drop=20= the=20role=0A+DROP=20OWNED=20BY=20regress_host_resource_admin;=20=20--=20= ok=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20ok=0A+--=20= Create=20non-superuser=20with=20privileges=20to=20configure=20plgsql=20= custom=20variables=0A+CREATE=20ROLE=20regress_plpgsql_admin=20= NOSUPERUSER;=0A+--=20Perform=20all=20operations=20as=20user=20= 'regress_plpgsql_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_plpgsql_admin;=0A+SET=20plpgsql.extra_errors=20TO=20'all';=0A= +SET=20plpgsql.extra_warnings=20TO=20'all';=0A+RESET=20= plpgsql.extra_errors;=0A+RESET=20plpgsql.extra_warnings;=0A+ALTER=20= SYSTEM=20SET=20plpgsql.extra_errors=20TO=20'all';=0A+ALTER=20SYSTEM=20= SET=20plpgsql.extra_warnings=20TO=20'all';=0A+ALTER=20SYSTEM=20RESET=20= plpgsql.extra_errors;=0A+ALTER=20SYSTEM=20RESET=20= plpgsql.extra_warnings;=0A+RESET=20SESSION=20AUTHORIZATION;=0A+GRANT=20= SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09plpgsql.extra_warnings,=20= plpgsql.extra_errors=0A+TO=20regress_plpgsql_admin;=0A+--=20Perform=20= all=20operations=20as=20user=20'regress_plpgsql_admin'=20--=0A+SET=20= SESSION=20AUTHORIZATION=20regress_plpgsql_admin;=20=20--=20ok=0A+SET=20= plpgsql.extra_errors=20TO=20'all';=20=20--=20ok=0A+SET=20= plpgsql.extra_warnings=20TO=20'all';=20=20--=20ok=0A+RESET=20= plpgsql.extra_errors;=20=20--=20ok=0A+RESET=20plpgsql.extra_warnings;=20=20= --=20ok=0A+ALTER=20SYSTEM=20SET=20plpgsql.extra_errors=20TO=20'all';=20=20= --=20ok=0A+ALTER=20SYSTEM=20SET=20plpgsql.extra_warnings=20TO=20'all';=20= =20--=20ok=0A+ALTER=20SYSTEM=20RESET=20plpgsql.extra_errors;=20=20--=20= ok=0A+ALTER=20SYSTEM=20RESET=20plpgsql.extra_warnings;=20=20--=20ok=0A= +RESET=20SESSION=20AUTHORIZATION;=0A+DROP=20ROLE=20= regress_plpgsql_admin;=20=20--=20fail,=20privileges=20remain=0A+REVOKE=20= SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09plpgsql.extra_warnings,=20= plpgsql.extra_errors=0A+FROM=20regress_plpgsql_admin;=0A+DROP=20ROLE=20= regress_plpgsql_admin;=20=20--=20ok=0Adiff=20--git=20= a/src/test/regress/sql/privileges.sql=20= b/src/test/regress/sql/privileges.sql=0Aindex=206353a1cb8c..eee18e7ba3=20= 100644=0A---=20a/src/test/regress/sql/privileges.sql=0A+++=20= b/src/test/regress/sql/privileges.sql=0A@@=20-36,6=20+36,33=20@@=20= CREATE=20USER=20regress_priv_user7;=0A=20GRANT=20pg_read_all_data=20TO=20= regress_priv_user6;=0A=20GRANT=20pg_write_all_data=20TO=20= regress_priv_user7;=0A=20=0A+GRANT=20SET=20VALUE=20ON=20enable_memoize=20= TO=20regress_priv_user6;=0A+GRANT=20SET=20VALUE=20ON=20enable_nestloop=20= TO=20regress_priv_user6;=0A+=0A+SET=20ROLE=20regress_priv_user6;=0A+SET=20= enable_memoize=20TO=20false;=0A+SET=20enable_nestloop=20TO=20false;=0A= +RESET=20enable_memoize;=0A+RESET=20enable_nestloop;=0A+RESET=20ROLE;=0A= +=0A+GRANT=20ALTER=20SYSTEM=20ON=20enable_seqscan=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20sort_mem=20= TO=20regress_priv_user7;=20--=20old=20name=20for=20"work_mem"=0A+GRANT=20= ALTER=20SYSTEM=20ON=20maintenance_work_mem=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20no_such_param=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20= no_such_extension.no_such_param=20TO=20regress_priv_user7;=20--=20ok=0A= +GRANT=20ALTER=20SYSTEM=20ON=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20""=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+GRANT=20ALTER=20SYSTEM=20ON=20"=20= "=20TO=20regress_priv_user7;=20--=20bad=20name=0A+GRANT=20ALTER=20SYSTEM=20= ON=20"=20foo=20"=20TO=20regress_priv_user7;=20--=20bad=20name=0A+=0A= +GRANT=20SELECT=20ON=20public.persons2=20TO=20regress_priv_user7;=0A+=0A= +SET=20ROLE=20regress_priv_user7;=0A+ALTER=20SYSTEM=20SET=20= enable_seqscan=20=3D=20OFF;=0A+ALTER=20SYSTEM=20RESET=20enable_seqscan;=0A= +RESET=20ROLE;=0A+=0A=20CREATE=20GROUP=20regress_priv_group1;=0A=20= CREATE=20GROUP=20regress_priv_group2=20WITH=20USER=20regress_priv_user1,=20= regress_priv_user2;=0A=20=0A@@=20-1389,10=20+1416,23=20@@=20DROP=20USER=20= regress_priv_user2;=0A=20DROP=20USER=20regress_priv_user3;=0A=20DROP=20= USER=20regress_priv_user4;=0A=20DROP=20USER=20regress_priv_user5;=0A= -DROP=20USER=20regress_priv_user6;=0A-DROP=20USER=20regress_priv_user7;=0A= +DROP=20USER=20regress_priv_user6;=20--=20privileges=20remain=0A+DROP=20= USER=20regress_priv_user7;=20--=20privileges=20remain=0A=20DROP=20USER=20= regress_priv_user8;=20--=20does=20not=20exist=0A=20=0A+REVOKE=20SELECT=20= ON=20public.persons2=20FROM=20regress_priv_user7;=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20ok=0A= +REVOKE=20ALTER=20SYSTEM=20ON=20work_mem=20FROM=20regress_priv_user7;=20= --=20ok,=20use=20new=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20vacuum_mem=20= FROM=20regress_priv_user7;=20--=20ok,=20use=20old=20name=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20no_such_param=20FROM=20regress_priv_user7;=20--=20= ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20no_such_extension.no_such_param=20= FROM=20regress_priv_user7;=20--=20ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20= FROM=20regress_priv_user7;=20--=20ok=0A+DROP=20USER=20= regress_priv_user7;=20--=20ok=0A+=0A+REVOKE=20SET=20VALUE=20ON=20= enable_memoize=20FROM=20regress_priv_user6;=0A+REVOKE=20SET=20VALUE=20ON=20= enable_nestloop=20FROM=20regress_priv_user6;=0A+=0A+DROP=20USER=20= regress_priv_user6;=20--=20ok=0A=20=0A=20--=20permissions=20with=20LOCK=20= TABLE=0A=20CREATE=20USER=20regress_locktable_user;=0A--=20=0A2.21.1=20= (Apple=20Git-122.3)=0A=0A= --Apple-Mail=_A50C4BFD-E863-4175-A9FC-56A1EF873A7A Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 =E2=80=94 Mark Dilger EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --Apple-Mail=_A50C4BFD-E863-4175-A9FC-56A1EF873A7A--