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 1nUEGG-0006yD-64 for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Mar 2022 20:59:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nUEGE-0000nH-S9 for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Mar 2022 20:59:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nUEGE-0000ma-1A for pgsql-hackers@lists.postgresql.org; Tue, 15 Mar 2022 20:59:18 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nUEG9-0001G1-6K for pgsql-hackers@postgresql.org; Tue, 15 Mar 2022 20:59:17 +0000 Received: by mail-pl1-x633.google.com with SMTP id r12so173508pla.1 for ; Tue, 15 Mar 2022 13:59:12 -0700 (PDT) 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=kVzUM4RQGLzz7/1YLZ8N1aZrWIPJSW2PWLEE+0GSIf8=; b=Nz1GXVb9IIqY0g0tgYeSTBZ+MGj1VxIHa1n4xveKHJ3cJH7GqixEFaKOjobgS2sVXm wRm5KCDYTtfwJ1i8T1Ci4+0bZLu513NytBFyVHDM5ogHMy+wrgkrbp19pXBpF0ww9tNn Si4R64jHs4FAfj8pm8uSuyx2r503U5k4RW+TPmWiXOolv4KSA/I1titoI5w6zImF/AgY zLXPNbIzrFwuU0zFd0fzDoRbCGUNQ2PfCa2BKqIWdZd5Ttxd6QfqH43sAaXu9vXl+xyU 8t3uMPNN3TZcffEj0LU58fYqteaREX9IIgP7eOQac/qNaX3Pzx4KC/VFcmRQsuR5FF2u zApA== 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=kVzUM4RQGLzz7/1YLZ8N1aZrWIPJSW2PWLEE+0GSIf8=; b=HfISWMTVm7kOOrC6ZqJUn6GVa169pgy0aoGckDwbXRSFUSWTqbOhX1iogwSp+BvhDX qaf3yK7I4lTUZ06RldEjBxrM1FswxBSEZvazQu0iixBiLBP5Q5AXMR6WR2AC6XPM9UVA mVGKp2Hbw2/aUchVsHavzPjL7rCrG9zum9hh6darfX3ZagbgQ96qwRT8nLdEG5UyXCAU Iz5z7MaByxwk4YOzxJN/4icss2m+15YtYG79MqSwv/NXPtVT5ifXsebLocfQtPMj2ecO aYml/nXjiXeXi5rVJy+zyhPvAhxxcLMkHR1oWV8fzHz1l8i/DyurnNN86yiuppbaOAck 0acw== X-Gm-Message-State: AOAM532hGVtedru0CMI/Nud5dpXTzGEj9Yf3MXLYBifAvfhR7PSU7cY1 6WiwUukVjxb6Z47T/8pgeiSp3Unuz+wJR585/rw8PfbC5sfX8hls4mZ0G5M268gIy0TS4QOSu8R qzfgLTNllStXn7P/SVLuoI4tEhlUv4DffOXmEiKSLSDMB6XvAWL7tD07DwZ1Io+nBI3YRXhk2Ec OWOZJ7/vf5W3ahQHm/9eN7Y7bJz+HIVSHV7woj X-Google-Smtp-Source: ABdhPJxJVph7h16TcS5GKwU+bgbHlFufLWZ1eh1hg5O9HiZ3mjkY1L60wuUyg06DRm9bJc+klZoP2A== X-Received: by 2002:a17:90a:d3d1:b0:1bb:fdc5:182 with SMTP id d17-20020a17090ad3d100b001bbfdc50182mr6830224pjw.206.1647377950326; Tue, 15 Mar 2022 13:59:10 -0700 (PDT) Received: from laptop280-ma-us.hitronhub.home (24-113-193-150.wavecable.com. [24.113.193.150]) by smtp.gmail.com with ESMTPSA id 67-20020a630846000000b00372782a65d0sm133427pgi.60.2022.03.15.13.59.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Mar 2022 13:59:09 -0700 (PDT) From: Mark Dilger Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_4460E328-B9A0-4CC4-B012-D7DCEBADE733" 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: Tue, 15 Mar 2022 13:59:08 -0700 In-Reply-To: <92485.1646609263@sss.pgh.pa.us> Cc: Joshua Brindle , Andrew Dunstan , Robert Haas , Jeff Davis , PostgreSQL-development , Joe Conway To: Tom Lane References: <3D691E20-C1D5-4B80-8BA5-6BEB63AF3029@enterprisedb.com> <9DB8DABC-0E1E-4AB0-BB11-9BC48E4C71BE@enterprisedb.com> <2D6C1081-DB7D-4260-8987-5B4912E95917@enterprisedb.com> <1A6DA47B-2D5F-427E-AD72-1D8BD23BF94C@enterprisedb.com> <79685.1646604824@sss.pgh.pa.us> <83814.1646607430@sss.pgh.pa.us> <78889A65-CA7A-4015-866D-33460967071D@enterprisedb.com> <92485.1646609263@sss.pgh.pa.us> 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=_4460E328-B9A0-4CC4-B012-D7DCEBADE733 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii > On Mar 6, 2022, at 3:27 PM, Tom Lane wrote: >=20 > Mark Dilger writes: >> The existing patch allows grants on unknown gucs, because it can't = know what guc an upgrade script will introduce, and the grant statement = may need to execute before the guc exists. >=20 > Yeah, that's the problematic case. It might mostly work to assume = that > an unknown GUC has an empty default ACL. This could fail to retain = the > default PUBLIC SET permission if it later turns out the GUC is USERSET On further reflection, I concluded this isn't needed. No current = extension, whether in-core or third party, expects to be able to create = a new GUC and then grant or revoke permissions on it. They can already = specify the guc context (PGC_USERS, etc). Introducing a feature that = depends on the dubious assumption that unrecognized GUCs will turn out = to be USERSET doesn't seem warranted. The patch attributes all grants of setting privileges to the bootstrap = superuser. Only superusers can grant or revoke privileges on settings, = and all settings are implicitly owned by the bootstrap superuser because = there is no explicit owner associated with settings. Consequently, = select_best_grantor(some_superuser, ..., BOOTSTRAP_SUPERUSERID, ...) = always chooses the bootstrap superuser. I don't see a problem with = this, but wouldn't mind a second opinion. Some people might find it = surprising when viewing the pg_setting_acl.setacl field. --Apple-Mail=_4460E328-B9A0-4CC4-B012-D7DCEBADE733 Content-Disposition: attachment; filename=v10-0001-Allow-grant-and-revoke-of-privileges-on-settings.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v10-0001-Allow-grant-and-revoke-of-privileges-on-settings.patch" Content-Transfer-Encoding: quoted-printable =46rom=20e5d01d17ca0a38d8f06b3989323fb5105b64230d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Mark=20Dilger=20=0A= Date:=20Tue,=208=20Mar=202022=2014:12:29=20-0800=0ASubject:=20[PATCH=20= v10]=20Allow=20grant=20and=20revoke=20of=20privileges=20on=20settings=0A=0A= Allow=20grant=20and=20revoke=20of=20privileges=20to=20set=20or=20alter=20= system=20set=0Aconfiguration=20variables.=20=20Each=20= (role,variable,privilege)=20triple=20can=0Abe=20independently=20granted=20= or=20revoked,=20so=20a=20user=20may=20be=20granted=0Aprivilege=20to=20= SET=20but=20not=20to=20ALTER=20SYSTEM=20SET=20on=20a=20variable,=20or=20= vice=0Aversa.=20=20Privilege=20to=20SET=20a=20userset=20variable=20is=20= implicitly=20granted=20to=0Apublic,=20but=20may=20be=20revoked.=0A---=0A=20= doc/src/sgml/catalogs.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20|=20=2075=20+++-=0A=20doc/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=2042=20++-=0A=20= doc/src/sgml/func.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20=2020=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/revoke.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=20=207=20+=0A=20doc/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=20= src/backend/catalog/Makefile=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=20=203=20+-=0A=20src/backend/catalog/aclchk.c=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20|=20262=20++++++++++++++=0A=20= src/backend/catalog/catalog.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=20=206=20+=0A=20src/backend/catalog/dependency.c=20=20=20=20=20=20=20= =20=20=20=20=20|=20=20=206=20+=0A=20src/backend/catalog/objectaddress.c=20= =20=20=20=20=20=20=20=20|=20=2046=20+++=0A=20= src/backend/catalog/pg_setting_acl.c=20=20=20=20=20=20=20=20|=20122=20= +++++++=0A=20src/backend/catalog/system_views.sql=20=20=20=20=20=20=20=20= |=20=2013=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=2087=20++++-=0A=20src/backend/utils/adt/acl.c=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20291=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|=20204=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=2061=20++++=0A=20src/bin/psql/tab-complete.c=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=20185=20+++++++++-=0A=20= src/include/catalog/dependency.h=20=20=20=20=20=20=20=20=20=20=20=20|=20=20= =201=20+=0A=20src/include/catalog/pg_default_acl.h=20=20=20=20=20=20=20=20= |=20=20=201=20+=0A=20src/include/catalog/pg_proc.dat=20=20=20=20=20=20=20= =20=20=20=20=20=20|=20=2023=20++=0A=20= src/include/catalog/pg_setting_acl.h=20=20=20=20=20=20=20=20|=20=2063=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/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=2011=20+-=0A=20src/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=203=20+=0A=20= src/include/utils/lsyscache.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=20=201=20+=0A=20src/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=20= src/test/modules/test_pg_dump/t/001_base.pl=20|=20=2061=20++++=0A=20= src/test/regress/expected/guc_privs.out=20=20=20=20=20|=20367=20= ++++++++++++++++++++=0A=20src/test/regress/expected/privileges.out=20=20=20= =20|=20=2056=20++-=0A=20src/test/regress/expected/rules.out=20=20=20=20=20= =20=20=20=20|=20=2013=20+=0A=20src/test/regress/parallel_schedule=20=20=20= =20=20=20=20=20=20=20|=20=20=202=20+-=0A=20= src/test/regress/sql/guc_privs.sql=20=20=20=20=20=20=20=20=20=20|=20165=20= +++++++++=0A=20src/test/regress/sql/privileges.sql=20=20=20=20=20=20=20=20= =20|=20=2044=20++-=0A=2045=20files=20changed,=202284=20insertions(+),=20= 50=20deletions(-)=0A=20create=20mode=20100644=20= src/backend/catalog/pg_setting_acl.c=0A=20create=20mode=20100644=20= src/include/catalog/pg_setting_acl.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= 83987a9904..7b288cce30=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_setting_acl= =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_setting_acl</structname>=0A+=0A+=20=20= =0A+=20=20=20= pg_setting_acl=0A+=20=20=0A+=0A+=20=20= =0A+=20=20=20The=20catalog=20= pg_setting_acl=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_setting_acl=0A+=20=20=20is=20= shared=20across=20all=20databases=20of=20a=20cluster:=20there=20is=20= only=20one=0A+=20=20=20copy=20of=20= pg_setting_acl=20per=20cluster,=20not=0A+=20=20=20= one=20per=20database.=0A+=20=20=0A+=0A+=20=20=0A+=20=20=20= <structname>pg_setting_acl</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= setting=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=20setacl=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=0A@@=20= -12540,11=20+12603,13=20@@=20SELECT=20*=20FROM=20pg_locks=20pl=20LEFT=20= JOIN=20pg_prepared_xacts=20ppx=0A=20=20=20=20=20= superuser=0A=20=20=20=20=20=0A=20= =20=20=20=20=20=0A-=20=20=20=20=20=20These=20settings=20can=20be=20= set=20from=20postgresql.conf,=0A-=20=20=20=20=20=20= or=20within=20a=20session=20via=20the=20SET=20= command;=20but=20only=20superusers=0A-=20=20=20=20=20=20can=20change=20= them=20via=20SET.=20=20Changes=20in=0A-=20=20=20=20=20= =20postgresql.conf=20will=20affect=20existing=20= sessions=0A-=20=20=20=20=20=20only=20if=20no=20session-local=20value=20= has=20been=20established=20with=20SET.=0A+=20=20=20=20= =20=20These=20settings=20can=20be=20set=20from=20= postgresql.conf,=20or=0A+=20=20=20=20=20=20within=20= a=20session=20via=20the=20SET=20command;=20but=20only=0A= +=20=20=20=20=20=20superusers=20or=20users=20with=20SET=20= VALUE=20privilege=20granted=0A+=20=20=20=20=20=20on=20the=20= setting=20can=20change=20them=20via=20SET.=20=20= Changes=20in=0A+=20=20=20=20=20=20postgresql.conf=20= will=20affect=20existing=20sessions=20only=0A+=20=20=20=20=20=20if=20no=20= session-local=20value=20has=20been=20established=20with=0A+=20=20=20=20=20= =20SET.=0A=20=20=20=20=20=20=0A=20=20=20=20=20= =0A=20=20=20=20=0Adiff=20--git=20= a/doc/src/sgml/ddl.sgml=20b/doc/src/sgml/ddl.sgml=0Aindex=20= 166b7a352d..49a1f3796e=20100644=0A---=20a/doc/src/sgml/ddl.sgml=0A+++=20= b/doc/src/sgml/ddl.sgml=0A@@=20-1691,7=20+1691,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-1959,6=20+1960,29=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.=20=20By=20default,=0A+=20= =20=20=20=20=20=20superuser=20run-time=20= configuration=20parameters=20may=20only=0A+=20=20=20=20=20=20=20be=20set=20= by=20superusers,=20and=20user=20run-time=20= configuration=0A+=20=20=20=20=20=20=20parameters=20can=20be=20set=20by=20= any=20user.=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=20SYSTEM=0A+=20=20=20=20=20= =0A+=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20Allows=20= non-superuser=20roles=20to=20use=20the=20ALTER=20SYSTEM=0A+=20=20= =20=20=20=20=20SET=20command=20to=20change=20server=20= configuration=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=20privileges=20required=20by=20other=20commands=20= are=20listed=20on=20the=0A@@=20-2097,6=20+2121,16=20@@=20REVOKE=20ALL=20= ON=20accounts=20FROM=20PUBLIC;=0A=20=20=20=20=20=20=20=20= TYPE=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=20= SET=20VALUE=0A+=20=20=20=20=20=20= s=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= -2203,6=20+2237,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/func.sgml=20b/doc/src/sgml/func.sgml=0Aindex=20= 8a802fb225..36b33d8639=20100644=0A---=20a/doc/src/sgml/func.sgml=0A+++=20= b/doc/src/sgml/func.sgml=0A@@=20-22691,8=20+22691,7=20@@=20SELECT=20*=20= FROM=20pg_ls_dir('.')=20WITH=20ORDINALITY=20AS=20t(ls,n);=0A=20=20=20=20= privilege=20is=20held=20with=20grant=20option.=20Also,=20multiple=20= privilege=20types=20can=20be=0A=20=20=20=20listed=20separated=20by=20= commas,=20in=20which=20case=20the=20result=20will=20be=20true=20if=20any=20= of=0A=20=20=20=20the=20listed=20privileges=20is=20held.=20(Case=20of=20= the=20privilege=20string=20is=20not=0A-=20=20=20significant,=20and=20= extra=20whitespace=20is=20allowed=20between=20but=20not=20within=0A-=20=20= =20privilege=20names.)=0A+=20=20=20significant,=20and=20extra=20= whitespace=20is=20allowed=20between=20privilege=20names.)=0A=20=20=20=20= Some=20examples:=0A=20=0A=20SELECT=20= has_table_privilege('myschema.mytable',=20'select');=0A@@=20-22957,6=20= +22956,23=20@@=20SELECT=20has_function_privilege('joeuser',=20= 'myfunc(int,=20text)',=20'execute');=0A=20=20=20=20=20=20=20=20= =0A=20=20=20=20=20=20=20=0A=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20=20=0A+=20=20= =20=20=20=20=20=20=20has_setting_privilege=0A+=20=20=20= =20=20=20=20=20=0A+=20=20=20=20=20=20=20=20= has_setting_privilege=20(=0A+=20=20=20=20=20=20=20=20= =20=20=20user=20name=20or=20= oid,=20=0A+=20=20=20=20=20=20=20=20=20=20= setting=20text=20or=20= oid,=0A+=20=20=20=20=20=20=20=20=20=20= privilege=20text=20)=0A+=20=20=20=20=20= =20=20=20boolean=0A+=20=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20=20Does=20= user=20have=20privilege=20for=20setting?=0A+=20=20=20=20=20=20=20=20= Allowable=20privilege=20types=20are=20SET=20VALUE=20= and=20ALTER=20SYSTEM.=0A+=20=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=0A+=0A=20=20=20=20=20=20=20= =0A=20=20=20=20=20=20=20=20=0A=20=20=20=20=20=20=20=20=20=0Adiff=20= --git=20a/doc/src/sgml/ref/grant.sgml=20b/doc/src/sgml/ref/grant.sgml=0A= index=20a897712de2..39c2ff1c81=20100644=0A---=20= a/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=20role_specification=20[,=20...]=20[=20= WITH=20GRANT=20OPTION=20]=0A=20=20=20=20=20[=20GRANTED=20BY=20= role_specification=20]=0A= =20=0A+GRANT=20{=20{=20SET=20VALUE=20|=20ALTER=20SYSTEM=20}=20[,=20...=20= ]=20|=20ALL=20[=20PRIVILEGES=20]=20}=0A+=20=20=20=20ON=20SETTING=20= configuration_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/revoke.sgml=20= b/doc/src/sgml/ref/revoke.sgml=0Aindex=203014c864ea..741ded8d1a=20100644=0A= ---=20a/doc/src/sgml/ref/revoke.sgml=0A+++=20= b/doc/src/sgml/ref/revoke.sgml=0A@@=20-118,6=20+118,13=20@@=20REVOKE=20[=20= GRANT=20OPTION=20FOR=20]=0A=20=20=20=20=20[=20GRANTED=20BY=20= role_specification=20]=0A= =20=20=20=20=20[=20CASCADE=20|=20RESTRICT=20]=0A=20=0A+REVOKE=20[=20= GRANT=20OPTION=20FOR=20]=0A+=20=20=20=20{=20{=20SET=20VALUE=20|=20ALTER=20= SYSTEM=20}=20[,=20...]=20|=20ALL=20[=20PRIVILEGES=20]=20}=0A+=20=20=20=20= ON=20SETTING=20configuration_parameter=20[,=20...]=0A= +=20=20=20=20FROM=20role_specification=20[,=20...]=0A+=20=20= =20=20[=20GRANTED=20BY=20role_specification=20]=0A+=20=20=20=20= [=20CASCADE=20|=20RESTRICT=20]=0A+=0A=20REVOKE=20[=20ADMIN=20OPTION=20= FOR=20]=0A=20=20=20=20=20role_name=20[,=20...]=20FROM=20= role_specification=20[,=20= ...]=0A=20=20=20=20=20[=20GRANTED=20BY=20role_specification=20]=0Adiff=20--git=20= a/doc/src/sgml/ref/set.sgml=20b/doc/src/sgml/ref/set.sgml=0Aindex=20= 339ee9eec9..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[=20= SESSION=20|=20LOCAL=20]=20TIME=20ZONE=20{=20timezone=20can=20be=20changed=20on-the-fly=20with=0A=20= =20=20=20SET.=0A-=20=20=20(But=20some=20require=20= superuser=20privileges=20to=20change,=20and=20others=20cannot=0A-=20=20=20= be=20changed=20after=20server=20or=20session=20start.)=0A+=20=20=20(But=20= some=20require=20either=20superuser=20privileges=20or=20granted=20= SET=0A+=20=20=20VALUE=20privileges=20to=20change,=20= and=20others=20cannot=20be=20changed=20after=0A+=20=20=20server=20or=20= session=20start.)=0A=20=20=20=20SET=20only=20affects=20= the=20value=20used=20by=20the=20current=0A=20=20=20=20session.=0A=20=20=20= =0Adiff=20--git=20a/src/backend/catalog/Makefile=20= b/src/backend/catalog/Makefile=0Aindex=20eefebb7bb8..4b28216f89=20100644=0A= ---=20a/src/backend/catalog/Makefile=0A+++=20= b/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=09pg_collation.o=20= \=0A+=09pg_setting_acl.o=20\=0A=20=09pg_constraint.o=20\=0A=20=09= pg_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#=20= there=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_setting_acl.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=201dd03a8e51..83f066118a=20100644=0A---=20= a/src/backend/catalog/aclchk.c=0A+++=20b/src/backend/catalog/aclchk.c=0A= @@=20-49,6=20+49,7=20@@=0A=20#include=20"catalog/pg_operator.h"=0A=20= #include=20"catalog/pg_opfamily.h"=0A=20#include=20"catalog/pg_proc.h"=0A= +#include=20"catalog/pg_setting_acl.h"=0A=20#include=20= "catalog/pg_statistic_ext.h"=0A=20#include=20"catalog/pg_subscription.h"=0A= =20#include=20"catalog/pg_tablespace.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_Setting(InternalGrant=20*grantStmt);=0A=20=0A=20static=20= void=20SetDefaultACLsInSchemas(InternalDefaultACL=20*iacls,=20List=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_SETTING:=0A+=09=09=09whole_mask=20=3D=20ACL_ALL_RIGHTS_SETTING;=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=20= reached,=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=09errormsg=20=3D=20= gettext_noop("invalid=20privilege=20type=20%s=20for=20foreign=20= server");=0A=20=09=09=09break;=0A+=09=09case=20OBJECT_SETTING:=0A+=09=09=09= all_privileges=20=3D=20ACL_ALL_RIGHTS_SETTING;=0A+=09=09=09errormsg=20=3D=20= gettext_noop("invalid=20privilege=20type=20%s=20for=20setting");=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)=20stmt->objtype);=0A= @@=20-600,6=20+609,9=20@@=20ExecGrantStmt_oids(InternalGrant=20*istmt)=0A= =20=09=09case=20OBJECT_TABLESPACE:=0A=20=09=09=09= ExecGrant_Tablespace(istmt);=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_SETTING:=0A+=09=09=09ExecGrant_Setting(istmt);=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)=20istmt->objtype);=0A= @@=20-759,6=20+771,38=20@@=20objectNamesToOids(ObjectType=20objtype,=20= List=20*objnames)=0A=20=09=09=09=09objects=20=3D=20lappend_oid(objects,=20= srvid);=0A=20=09=09=09}=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_SETTING:=0A+=09=09=09foreach(cell,=20objnames)=0A+=09=09=09{=0A+=09= =09=09=09char=09=20=20=20*setting=20=3D=20strVal(lfirst(cell));=0A+=09=09= =09=09Oid=09=09=09settingid=20=3D=20get_setting_oid(setting,=20true);=0A= +=0A+=09=09=09=09if=20(!OidIsValid(settingid))=0A+=09=09=09=09{=0A+=09=09= =09=09=09/*=0A+=09=09=09=09=09=20*=20Lookup=20the=20existing=20entry,=20= or=20if=20necessary,=20add=20a=20new=0A+=09=09=09=09=09=20*=20entry=20= for=20this=20parameter.=20=20Entries=20only=20exist=20for=0A+=09=09=09=09= =09=20*=20parameters=20which=20currently=20have,=20or=20previously=20= have=20had,=0A+=09=09=09=09=09=20*=20privileges=20assigned.=0A+=09=09=09=09= =09=20*=0A+=09=09=09=09=09=20*=20It=20is=20tempting=20to=20sanity-check=20= the=20given=20configuration=0A+=09=09=09=09=09=20*=20parameter=20name=20= against=20known=20guc=20names=20in=20the=20guc=0A+=09=09=09=09=09=20*=20= tables,=20but=20for=20handling=20upgrades=20we=20need=20to=20accept=0A+=09= =09=09=09=09=20*=20setting=20names=20that=20do=20not=20yet=20exist.=0A+=09= =09=09=09=09=20*/=0A+=09=09=09=09=09settingid=20=3D=20= SettingAclCreate(setting,=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,=20settingid);=0A+=09=09=09}=0A+=09=09=09= break;=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= SettingAclRelationId:=0A+=09=09=09=09istmt.objtype=20=3D=20= OBJECT_SETTING;=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,139=20@@=20= ExecGrant_Type(InternalGrant=20*istmt)=0A=20=09table_close(relation,=20= RowExclusiveLock);=0A=20}=0A=20=0A+static=20void=0A= +ExecGrant_Setting(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_SETTING;=0A+=0A+=09relation=20=3D= =20table_open(SettingAclRelationId,=20RowExclusiveLock);=0A+=0A+=09= foreach(cell,=20istmt->objects)=0A+=09{=0A+=09=09Oid=09=09=09settingId=20= =3D=20lfirst_oid(cell);=0A+=09=09Form_pg_setting_acl=20= pg_setting_acl_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_setting_acl];=0A+=09=09bool=09=09= nulls[Natts_pg_setting_acl];=0A+=09=09bool=09=09= replaces[Natts_pg_setting_acl];=0A+=09=09int=09=09=09noldmembers;=0A+=09=09= int=09=09=09nnewmembers;=0A+=09=09Oid=09=09=20=20=20*oldmembers;=0A+=09=09= Oid=09=09=20=20=20*newmembers;=0A+=0A+=09=09tuple=20=3D=20= SearchSysCache1(SETTINGOID,=20ObjectIdGetDatum(settingId));=0A+=09=09if=20= (!HeapTupleIsValid(tuple))=0A+=09=09=09elog(ERROR,=20"cache=20lookup=20= failed=20for=20setting=20%u",=20settingId);=0A+=0A+=09=09= pg_setting_acl_tuple=20=3D=20(Form_pg_setting_acl)=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(SETTINGNAME,=20tuple,=20= Anum_pg_setting_acl_setacl,=0A+=09=09=09=09=09=09=09=09=20=20=20= &isNull);=0A+=0A+=09=09/*=0A+=09=09=20*=20If=20the=20acl=20is=20null,=20= we=20need=20to=20create=20a=20more=20permissive=20default=20acl=0A+=09=09= =20*=20for=20userset=20variables=20than=20for=20any=20others.=0A+=09=09=20= */=0A+=09=09if=20(isNull)=0A+=09=09{=0A+=09=09=09const=20char=20= *setting;=0A+=0A+=09=09=09setting=20=3D=20= text_to_cstring(&pg_setting_acl_tuple->setting);=0A+=09=09=09old_acl=20=3D= =20aclsettingdefault(find_option_context(setting)=20=3D=3D=20= PGC_USERSET);=0A+=09=09=09/*=20There=20are=20no=20old=20member=20roles=20= according=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=20DatumGetAclPCopy(aclDatum);=0A+=09=09=09/*=20= Get=20the=20roles=20mentioned=20in=20the=20existing=20ACL=20*/=0A+=09=09=09= noldmembers=20=3D=20aclmembers(old_acl,=20&oldmembers);=0A+=09=09}=0A+=0A= +=09=09/*=20Determine=20ID=20to=20do=20the=20grant=20as,=20and=20= available=20grant=20options=20*/=0A+=09=09= select_best_grantor(GetUserId(),=20istmt->privileges,=0A+=09=09=09=09=09=09= =09old_acl,=20BOOTSTRAP_SUPERUSERID,=0A+=09=09=09=09=09=09=09&grantorId,=20= &avail_goptions);=0A+=0A+=09=09/*=0A+=09=09=20*=20Restrict=20the=20= privileges=20to=20what=20we=20can=20actually=20grant,=20and=20emit=20the=0A= +=09=09=20*=20standards-mandated=20warning=20and=20error=20messages.=0A+=09= =09=20*/=0A+=09=09this_privileges=20=3D=0A+=09=09=09= restrict_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=20settingId,=20grantorId,=20OBJECT_SETTING,=0A+=09=09=09=09=09= =09=09=09=09=20text_to_cstring(&pg_setting_acl_tuple->setting),=0A+=09=09= =09=09=09=09=09=09=09=200,=20NULL);=0A+=0A+=09=09/*=0A+=09=09=20*=20= Generate=20new=20ACL.=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_setting_acl_setacl=20-=201]=20=3D=20true;=0A= +=09=09values[Anum_pg_setting_acl_setacl=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(settingId,=20SettingAclRelationId,=200,=20= new_acl);=0A+=0A+=09=09/*=20Update=20the=20shared=20dependency=20ACL=20= info=20*/=0A+=09=09updateAclDependencies(SettingAclRelationId,=0A+=09=09=09= =09=09=09=09=20=20pg_setting_acl_tuple->oid,=200,=0A+=09=09=09=09=09=09=09= =20=20InvalidOid,=0A+=09=09=09=09=09=09=09=20=20noldmembers,=20= oldmembers,=0A+=09=09=09=09=09=09=09=20=20nnewmembers,=20newmembers);=0A= +=0A+=09=09ReleaseSysCache(tuple);=0A+=0A+=09=09pfree(new_acl);=0A+=0A+=09= =09/*=20Post=20alter=20hook=20called=20for=20grant=20and=20revoke=20*/=0A= +=09=09InvokeObjectPostAlterHook(SettingAclRelationId,=20settingId,=20= 0);=0A+=0A+=09=09/*=20prevent=20error=20when=20processing=20duplicate=20= objects=20*/=0A+=09=09CommandCounterIncrement();=0A+=09}=0A+=0A+=09= table_close(relation,=20RowExclusiveLock);=0A+}=0A+=0A=20=0A=20static=20= AclMode=0A=20string_to_privilege(const=20char=20*privname)=0A@@=20= -3255,6=20+3435,10=20@@=20string_to_privilege(const=20char=20*privname)=0A= =20=09=09return=20ACL_CREATE_TEMP;=0A=20=09if=20(strcmp(privname,=20= "connect")=20=3D=3D=200)=0A=20=09=09return=20ACL_CONNECT;=0A+=09if=20= (strcmp(privname,=20"set=20value")=20=3D=3D=200)=0A+=09=09return=20= ACL_SET_VALUE;=0A+=09if=20(strcmp(privname,=20"alter=20system")=20=3D=3D=20= 0)=0A+=09=09return=20ACL_ALTER_SYSTEM;=0A=20=09if=20(strcmp(privname,=20= "rule")=20=3D=3D=200)=0A=20=09=09return=200;=09=09=09=09/*=20ignore=20= old=20RULE=20privileges=20*/=0A=20=09ereport(ERROR,=0A@@=20-3292,6=20= +3476,10=20@@=20privilege_to_string(AclMode=20privilege)=0A=20=09=09=09= return=20"TEMP";=0A=20=09=09case=20ACL_CONNECT:=0A=20=09=09=09return=20= "CONNECT";=0A+=09=09case=20ACL_SET_VALUE:=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= privilege:=20%d",=20(int)=20privilege);=0A=20=09}=0A@@=20-3328,6=20= +3516,13=20@@=20aclcheck_error(AclResult=20aclerr,=20ObjectType=20= objtype,=0A=20=09=09=09=09=09case=20OBJECT_COLUMN:=0A=20=09=09=09=09=09=09= msg=20=3D=20gettext_noop("permission=20denied=20for=20column=20%s");=0A=20= =09=09=09=09=09=09break;=0A+=09=09=09=09=09case=20OBJECT_SETTING:=0A+=09=09= =09=09=09=09/*=0A+=09=09=09=09=09=09=20*=20Quote=20the=20object=20name=20= for=20backward=20compatibility=0A+=09=09=09=09=09=09=20*=20with=20= behavior=20before=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=20= to=20set=20parameter=20\"%s\"");=0A+=09=09=09=09=09=09break;=0A=20=09=09=09= =09=09case=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+3759,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_SETTING:=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+4196,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_setting_acl_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=20setting's=20ACL=20from=20pg_setting_acl=0A+=09=20*/=0A+=09= tuple=20=3D=20SearchSysCache1(SETTINGOID,=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("setting=20with=20OID=20%u=20does=20not=20exist",=0A= +=09=09=09=09=09=09config_oid)));=0A+=0A+=09aclDatum=20=3D=20= SysCacheGetAttr(SETTINGOID,=20tuple,=20Anum_pg_setting_acl_setacl,=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=20ACL=20*/=0A+=09=09acl=20=3D=20= acldefault(OBJECT_SETTING,=20InvalidOid);=0A+=09=09aclDatum=20=3D=20= (Datum)=200;=0A+=09}=0A+=09else=0A+=09{=0A+=09=09/*=20detoast=20ACL=20if=20= necessary=20*/=0A+=09=09acl=20=3D=20DatumGetAclP(aclDatum);=0A+=09}=0A+=0A= +=09result=20=3D=20aclmask(acl,=20roleid,=20InvalidOid,=20mask,=20how);=0A= +=0A+=09/*=20if=20we=20have=20a=20detoasted=20copy,=20free=20it=20*/=0A+=09= if=20(acl=20&&=20(Pointer)=20acl=20!=3D=20DatumGetPointer(aclDatum))=0A+=09= =09pfree(acl);=0A+=0A+=09ReleaseSysCache(tuple);=0A+=0A+=09return=20= result;=0A+}=0A+=0A=20/*=0A=20=20*=20Exported=20routine=20for=20= examining=20a=20user's=20privileges=20for=20a=20function=0A=20=20*/=0A@@=20= -4713,6=20+4962,19=20@@=20pg_database_aclcheck(Oid=20db_oid,=20Oid=20= roleid,=20AclMode=20mode)=0A=20=09=09return=20ACLCHECK_NO_PRIV;=0A=20}=0A= =20=0A+/*=0A+=20*=20Exported=20routine=20for=20checking=20a=20user's=20= access=20privileges=20to=20a=20configuration=0A+=20*=20parameter=0A+=20= */=0A+AclResult=0A+pg_setting_acl_aclcheck(Oid=20config_oid,=20Oid=20= roleid,=20AclMode=20mode)=0A+{=0A+=09if=20= (pg_setting_acl_aclmask(config_oid,=20roleid,=20mode,=20ACLMASK_ANY)=20= !=3D=200)=0A+=09=09return=20ACLCHECK_OK;=0A+=09else=0A+=09=09return=20= ACLCHECK_NO_PRIV;=0A+}=0A+=0A=20/*=0A=20=20*=20Exported=20routine=20for=20= checking=20a=20user's=20access=20privileges=20to=20a=20function=0A=20=20= */=0Adiff=20--git=20a/src/backend/catalog/catalog.c=20= b/src/backend/catalog/catalog.c=0Aindex=20dfd5fb669e..78868e7052=20= 100644=0A---=20a/src/backend/catalog/catalog.c=0A+++=20= b/src/backend/catalog/catalog.c=0A@@=20-34,6=20+34,7=20@@=0A=20#include=20= "catalog/pg_largeobject.h"=0A=20#include=20"catalog/pg_namespace.h"=0A=20= #include=20"catalog/pg_replication_origin.h"=0A+#include=20= "catalog/pg_setting_acl.h"=0A=20#include=20"catalog/pg_shdepend.h"=0A=20= #include=20"catalog/pg_shdescription.h"=0A=20#include=20= "catalog/pg_shseclabel.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= SettingAclRelationId=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= SettingAclSettingIndexId=20||=0A+=09=09relationId=20=3D=3D=20= SettingAclOidIndexId=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= PgSettingAclToastTable=20||=0A+=09=09relationId=20=3D=3D=20= PgSettingAclToastIndex=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=20ab9e42d7d1..5d2504463d=20100644=0A---=20= a/src/backend/catalog/dependency.c=0A+++=20= b/src/backend/catalog/dependency.c=0A@@=20-52,6=20+52,7=20@@=0A=20= #include=20"catalog/pg_publication_namespace.h"=0A=20#include=20= "catalog/pg_publication_rel.h"=0A=20#include=20"catalog/pg_rewrite.h"=0A= +#include=20"catalog/pg_setting_acl.h"=0A=20#include=20= "catalog/pg_statistic_ext.h"=0A=20#include=20"catalog/pg_subscription.h"=0A= =20#include=20"catalog/pg_tablespace.h"=0A@@=20-150,6=20+151,7=20@@=20= static=20const=20Oid=20object_classes[]=20=3D=20{=0A=20=09= TypeRelationId,=09=09=09=09/*=20OCLASS_TYPE=20*/=0A=20=09CastRelationId,=09= =09=09=09/*=20OCLASS_CAST=20*/=0A=20=09CollationRelationId,=09=09/*=20= OCLASS_COLLATION=20*/=0A+=09SettingAclRelationId,=09=09/*=20= OCLASS_SETTING=20*/=0A=20=09ConstraintRelationId,=09=09/*=20= OCLASS_CONSTRAINT=20*/=0A=20=09ConversionRelationId,=09=09/*=20= OCLASS_CONVERSION=20*/=0A=20=09AttrDefaultRelationId,=09=09/*=20= OCLASS_DEFAULT=20*/=0A@@=20-1504,6=20+1506,7=20@@=20doDeletion(const=20= ObjectAddress=20*object,=20int=20flags)=0A=20=09=09=09/*=0A=20=09=09=09=20= *=20These=20global=20object=20types=20are=20not=20supported=20here.=0A=20= =09=09=09=20*/=0A+=09=09case=20OCLASS_SETTING:=0A=20=09=09case=20= OCLASS_ROLE:=0A=20=09=09case=20OCLASS_DATABASE:=0A=20=09=09case=20= OCLASS_TBLSPACE:=0A@@=20-2778,6=20+2781,9=20@@=20getObjectClass(const=20= ObjectAddress=20*object)=0A=20=09=09case=20CollationRelationId:=0A=20=09=09= =09return=20OCLASS_COLLATION;=0A=20=0A+=09=09case=20= SettingAclRelationId:=0A+=09=09=09return=20OCLASS_SETTING;=0A+=0A=20=09=09= case=20ConstraintRelationId:=0A=20=09=09=09return=20OCLASS_CONSTRAINT;=0A= =20=0Adiff=20--git=20a/src/backend/catalog/objectaddress.c=20= b/src/backend/catalog/objectaddress.c=0Aindex=20f30c742d48..1ef833a0e3=20= 100644=0A---=20a/src/backend/catalog/objectaddress.c=0A+++=20= b/src/backend/catalog/objectaddress.c=0A@@=20-51,6=20+51,7=20@@=0A=20= #include=20"catalog/pg_publication_namespace.h"=0A=20#include=20= "catalog/pg_publication_rel.h"=0A=20#include=20"catalog/pg_rewrite.h"=0A= +#include=20"catalog/pg_setting_acl.h"=0A=20#include=20= "catalog/pg_statistic_ext.h"=0A=20#include=20"catalog/pg_subscription.h"=0A= =20#include=20"catalog/pg_tablespace.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_SETTING:=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=20ObjectAddress=20= *object,=20bool=20missing_ok)=0A=20=09=09=09=09break;=0A=20=09=09=09}=0A=20= =0A+=09=09case=20OCLASS_SETTING:=0A+=09=09=09{=0A+=09=09=09=09char=09=20=20= =20*setting;=0A+=0A+=09=09=09=09setting=20=3D=20= get_setting_name(object->objectId);=0A+=09=09=09=09if=20(!setting)=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=20setting=20%u",=0A+=09=09=09= =09=09=09=09=20object->objectId);=0A+=09=09=09=09=09break;=0A+=09=09=09=09= }=0A+=09=09=09=09appendStringInfo(&buffer,=20_("setting=20%s"),=20= setting);=0A+=09=09=09=09break;=0A+=09=09=09}=0A+=0A=20=09=09case=20= OCLASS_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@@=20= getObjectTypeDescription(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=20OCLASS_SETTING:=0A= +=09=09=09appendStringInfoString(&buffer,=20"setting");=0A+=09=09=09= break;=0A+=0A=20=09=09case=20OCLASS_CONSTRAINT:=0A=20=09=09=09= getConstraintTypeDescription(&buffer,=20object->objectId,=0A=20=09=09=09=09= =09=09=09=09=09=09=20missing_ok);=0A@@=20-4977,6=20+4999,30=20@@=20= getObjectIdentityParts(const=20ObjectAddress=20*object,=0A=20=09=09=09=09= break;=0A=20=09=09=09}=0A=20=0A+=09=09case=20OCLASS_SETTING:=0A+=09=09=09= {=0A+=09=09=09=09HeapTuple=09configTup;=0A+=09=09=09=09= Form_pg_setting_acl=20configForm;=0A+=09=09=09=09char=09=20=20=20= *namestr;=0A+=0A+=09=09=09=09configTup=20=3D=20= SearchSysCache1(SETTINGOID,=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=20setting=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_setting_acl)=20GETSTRUCT(configTup);=0A+=09= =09=09=09namestr=20=3D=20text_to_cstring(&configForm->setting);=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_setting_acl.c=20= b/src/backend/catalog/pg_setting_acl.c=0Anew=20file=20mode=20100644=0A= index=200000000000..3c6594da03=0A---=20/dev/null=0A+++=20= b/src/backend/catalog/pg_setting_acl.c=0A@@=20-0,0=20+1,122=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_setting_acl.c=0A+=20*=09=20=20routines=20to=20= support=20manipulation=20of=20the=20pg_setting_acl=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_setting_acl.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_namespace.h"=0A+#include=20"catalog/pg_setting_acl.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*=20SettingAclCreate=0A+=20*=0A+=20= *=20Add=20a=20new=20tuple=20to=20pg_setting_acl.=0A+=20*=0A+=20*=20= setting:=20the=20setting=20name=20to=20create.=0A+=20*=20if_not_exists:=20= if=20true,=20don't=20fail=20on=20duplicate=20name,=20but=20rather=20= return=0A+=20*=20the=20existing=20entry's=20Oid.=0A+=20*/=0A+Oid=0A= +SettingAclCreate(const=20char=20*setting,=20bool=20if_not_exists)=0A+{=0A= +=09Relation=09rel;=0A+=09TupleDesc=09tupDesc;=0A+=09HeapTuple=09tuple;=0A= +=09Datum=09=09values[Natts_pg_setting_acl];=0A+=09bool=09=09= nulls[Natts_pg_setting_acl];=0A+=09Oid=09=09=09settingId;=0A+=09const=20= char=20*canonical;=0A+=0A+=09/*=0A+=09=20*=20Check=20whether=20the=20= setting=20(by=20the=20given=20name=20or=20alias)=0A+=09=20*=20already=20= exists.=0A+=09=20*/=0A+=09settingId=20=3D=20get_setting_oid(setting,=20= true);=0A+=09if=20(OidIsValid(settingId))=0A+=09{=0A+=09=09if=20= (if_not_exists)=0A+=09=09=09return=20settingId;=0A+=09=09ereport(ERROR,=0A= +=09=09=09=09(errcode(ERRCODE_DUPLICATE_OBJECT),=0A+=09=09=09=09=20= errmsg("setting=20\"%s\"=20already=20exists",=0A+=09=09=09=09=09=09= setting)));=0A+=09}=0A+=0A+=09/*=0A+=09=20*=20We=20must=20not=20require=20= the=20setting=20to=20be=20in=20the=20list=20of=20existent=20GUCs,=0A+=09=20= *=20as=20we=20may=20be=20called=20at=20different=20points=20during=20= upgrades=20or=20the=0A+=09=20*=20installation=20or=20removal=20of=20= extensions.=20=20Instead,=20perform=20a=20basic=20sanity=0A+=09=20*=20= check=20of=20the=20setting,=20and=20translate=20old=20forms=20of=20known=20= names=20to=20their=0A+=09=20*=20canonical=20forms.=0A+=09=20*=0A+=09=20*=20= If=20you=20deprecate=20a=20configuration=20name=20in=20favor=20of=20a=20= new=20spelling,=20be=0A+=09=20*=20sure=20to=20consider=20whether=20to=20= also=20upgrade=20pg_setting_acl=20entries.=0A+=09=20*/=0A+=09if=20= (!valid_variable_name(setting,=20NULL))=0A+=09=09ereport(ERROR,=0A+=09=09= =09=09(errcode(ERRCODE_INVALID_NAME),=0A+=09=09=09=09=20errmsg("invalid=20= setting=20name=20\"%s\"",=0A+=09=09=09=09=09=09setting)));=0A+=09= canonical=20=3D=20GetConfigOptionCanonicalName(setting);=0A+=09if=20= (!canonical)=0A+=09=09canonical=20=3D=20setting;=0A+=0A+=09/*=0A+=09=20*=20= Create=20and=20insert=20a=20new=20record,=20starting=20with=20a=20blank=20= Acl.=0A+=09=20*=0A+=09=20*=20We=20don't=20take=20a=20strong=20enough=20= lock=20to=20prevent=20concurrent=20insertions,=0A+=09=20*=20relying=20= instead=20on=20the=20unique=20index.=0A+=09=20*/=0A+=09rel=20=3D=20= table_open(SettingAclRelationId,=20RowExclusiveLock);=0A+=09tupDesc=20=3D=20= RelationGetDescr(rel);=0A+=09MemSet(values,=200,=20sizeof(values));=0A+=09= MemSet(nulls,=20false,=20sizeof(nulls));=0A+=09= values[Anum_pg_setting_acl_setting=20-=201]=20=3D=0A+=09=09= DirectFunctionCall1(textin,=20CStringGetDatum(canonical));=0A+=09= settingId=20=3D=20GetNewOidWithIndex(rel,=0A+=09=09=09=09=09=09=09=09=09=20= =20=20SettingAclOidIndexId,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= Anum_pg_setting_acl_oid);=0A+=09values[Anum_pg_setting_acl_oid=20-=201]=20= =3D=20ObjectIdGetDatum(settingId);=0A+=09= nulls[Anum_pg_setting_acl_setacl=20-=201]=20=3D=20true;=0A+=09tuple=20=3D=20= heap_form_tuple(tupDesc,=20values,=20nulls);=0A+=09= CatalogTupleInsert(rel,=20tuple);=0A+=0A+=09/*=20Post=20creation=20hook=20= for=20new=20setting=20*/=0A+=09= InvokeObjectPostCreateHook(SettingAclRelationId,=20settingId,=200);=0A+=0A= +=09/*=0A+=09=20*=20Close=20pg_setting_acl,=20but=20keep=20lock=20till=20= commit.=0A+=09=20*/=0A+=09heap_freetuple(tuple);=0A+=09table_close(rel,=20= NoLock);=0A+=0A+=09return=20settingId;=0A+}=0Adiff=20--git=20= a/src/backend/catalog/system_views.sql=20= b/src/backend/catalog/system_views.sql=0Aindex=2040b7bca5a9..92b226b8d2=20= 100644=0A---=20a/src/backend/catalog/system_views.sql=0A+++=20= b/src/backend/catalog/system_views.sql=0A@@=20-595,6=20+595,19=20@@=20= CREATE=20RULE=20pg_settings_n=20AS=0A=20=0A=20GRANT=20SELECT,=20UPDATE=20= ON=20pg_settings=20TO=20PUBLIC;=0A=20=0A+CREATE=20VIEW=20= pg_setting_privileges=20AS=0A+=09SELECT=20grantor.rolname=20AS=20= grantor,=0A+=09=09=20=20=20grantee.rolname=20AS=20grantee,=0A+=09=09=20=20= =20set_acl.setting=20AS=20setting,=0A+=09=09=20=20=20acl.privilege_type=20= AS=20privilege_type,=0A+=09=09=20=20=20acl.is_grantable=0A+=09=09FROM=20= pg_catalog.pg_setting_acl=20set_acl,=0A+=09=09LATERAL=20(SELECT=20*=20= FROM=20aclexplode(set_acl.setacl))=20acl=0A+=09=09LEFT=20JOIN=20= pg_catalog.pg_authid=20grantee=20ON=20acl.grantee=20=3D=20grantee.oid=0A= +=09=09LEFT=20JOIN=20pg_catalog.pg_authid=20grantor=20ON=20acl.grantor=20= =3D=20grantor.oid;=0A+=0A+GRANT=20SELECT=20ON=20pg_setting_privileges=20= TO=20PUBLIC;=0A+=0A=20CREATE=20VIEW=20pg_file_settings=20AS=0A=20=20=20=20= SELECT=20*=20FROM=20pg_show_all_file_settings()=20AS=20A;=0A=20=0Adiff=20= --git=20a/src/backend/commands/alter.c=20b/src/backend/commands/alter.c=0A= index=201f64c8aa51..3dd0c5cadb=20100644=0A---=20= a/src/backend/commands/alter.c=0A+++=20b/src/backend/commands/alter.c=0A= @@=20-639,6=20+639,7=20@@=20AlterObjectNamespace_oid(Oid=20classId,=20= Oid=20objid,=20Oid=20nspOid,=0A=20=09=09=09break;=0A=20=0A=20=09=09case=20= OCLASS_CAST:=0A+=09=09case=20OCLASS_SETTING:=0A=20=09=09case=20= OCLASS_CONSTRAINT:=0A=20=09=09case=20OCLASS_DEFAULT:=0A=20=09=09case=20= OCLASS_LANGUAGE:=0Adiff=20--git=20a/src/backend/commands/dropcmds.c=20= b/src/backend/commands/dropcmds.c=0Aindex=20c9b5732448..00398727ed=20= 100644=0A---=20a/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_SETTING:=0A+=09=09=09if=20= (!schema_does_not_exist_skipping(castNode(List,=20object),=20&msg,=20= &name))=0A+=09=09=09{=0A+=09=09=09=09msg=20=3D=20gettext_noop("setting=20= \"%s\"=20does=20not=20exist,=20skipping");=0A+=09=09=09=09name=20=3D=20= NameListToString(castNode(List,=20object));=0A+=09=09=09}=0A+=09=09=09= break;=0A=20=09=09case=20OBJECT_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=203c3fc2515b..f500e8c40d=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_SETTING:=0A=20=09=09= case=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_SETTING:=0A=20=09=09= case=20OCLASS_DATABASE:=0A=20=09=09case=20OCLASS_TBLSPACE:=0A=20=09=09= case=20OCLASS_ROLE:=0A@@=20-2022,6=20+2024,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_SETTING:=0A+=09=09=09return=20"SETTING";=0A=20=09=09case=20= OBJECT_TABLE:=0A=20=09=09=09return=20"TABLE";=0A=20=09=09case=20= OBJECT_SEQUENCE:=0A@@=20-2105,6=20+2109,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_SETTING:=0A+=09=09=09return=20"SETTINGS";=0A=20=09=09case=20= OBJECT_TABLE:=0A=20=09=09=09return=20"TABLES";=0A=20=09=09case=20= OBJECT_SEQUENCE:=0Adiff=20--git=20a/src/backend/commands/seclabel.c=20= b/src/backend/commands/seclabel.c=0Aindex=207a62d547e2..7b05eb0110=20= 100644=0A---=20a/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_SETTING:=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=20dc5872f988..11671390a5=20= 100644=0A---=20a/src/backend/commands/tablecmds.c=0A+++=20= b/src/backend/commands/tablecmds.c=0A@@=20-12620,6=20+12620,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_SETTING:=0A=20=09=09=09= case=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= a03b33b53b..172d9e31e3=20100644=0A---=20a/src/backend/parser/gram.y=0A= +++=20b/src/backend/parser/gram.y=0A@@=20-363,8=20+363,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=20setting_name=0A+%type=20=09= OptSchemaEltList=20setting_target=0A=20=0A=20%type=20=09=09am_type=0A= =20=0A@@=20-728,7=20+728,7=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20=09ROUTINE=20ROUTINES=20ROW=20ROWS=20RULE=0A=20=0A=20=09= SAVEPOINT=20SCHEMA=20SCHEMAS=20SCROLL=20SEARCH=20SECOND_P=20SECURITY=20= SELECT=20SEQUENCE=20SEQUENCES=0A-=09SERIALIZABLE=20SERVER=20SESSION=20= SESSION_USER=20SET=20SETS=20SETOF=20SHARE=20SHOW=0A+=09SERIALIZABLE=20= SERVER=20SESSION=20SESSION_USER=20SET=20SETS=20SETOF=20SETTING=20SHARE=20= SHOW=0A=20=09SIMILAR=20SIMPLE=20SKIP=20SMALLINT=20SNAPSHOT=20SOME=20= SQL_P=20STABLE=20STANDALONE_P=0A=20=09START=20STATEMENT=20STATISTICS=20= STDIN=20STDOUT=20STORAGE=20STORED=20STRICT_P=20STRIP_P=0A=20=09= SUBSCRIPTION=20SUBSTRING=20SUPPORT=20SYMMETRIC=20SYSID=20SYSTEM_P=0A@@=20= -6981,6=20+6981,20=20@@=20GrantStmt:=09GRANT=20privileges=20ON=20= privilege_target=20TO=20grantee_list=0A=20=09=09=09=09=09n->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=20privileges=20ON=20SETTING=20setting_target=20TO=20= grantee_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=20makeNode(GrantStmt);=0A= +=09=09=09=09=09n->is_grant=20=3D=20true;=0A+=09=09=09=09=09= n->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=20OBJECT_SETTING;=0A= +=09=09=09=09=09n->objects=20=3D=20$5;=0A+=09=09=09=09=09n->grantees=20=3D= =20$7;=0A+=09=09=09=09=09n->grant_option=20=3D=20$8;=0A+=09=09=09=09=09= n->grantor=20=3D=20$9;=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-7014,6=20+7028,36=20@@=20= RevokeStmt:=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=20= privileges=20ON=20SETTING=20setting_target=20FROM=20grantee_list=0A+=09=09= =09opt_granted_by=20opt_drop_behavior=0A+=09=09=09=09{=0A+=09=09=09=09=09= GrantStmt=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= false;=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_SETTING;=0A+=09=09=09=09=09n->objects=20=3D=20$5;=0A+=09=09=09=09=09= n->grantees=20=3D=20$7;=0A+=09=09=09=09=09n->grantor=20=3D=20$8;=0A+=09=09= =09=09=09n->behavior=20=3D=20$9;=0A+=09=09=09=09=09$$=20=3D=20(Node=20= *)n;=0A+=09=09=09=09}=0A+=09=09=09|=20REVOKE=20GRANT=20OPTION=20FOR=20= privileges=20ON=20SETTING=20setting_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_SETTING;=0A+=09=09=09=09=09n->objects=20=3D=20$8;=0A+=09=09=09=09=09= n->grantees=20=3D=20$10;=0A+=09=09=09=09=09n->grantor=20=3D=20$11;=0A+=09= =09=09=09=09n->behavior=20=3D=20$12;=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-7073,6=20+7117,20=20= @@=20privilege:=09SELECT=20opt_column_list=0A=20=09=09=09=09n->cols=20=3D=20= $2;=0A=20=09=09=09=09$$=20=3D=20n;=0A=20=09=09=09}=0A+=09=09|=20SET=20= VALUE_P=0A+=09=09=09{=0A+=09=09=09=09AccessPriv=20*n=20=3D=20= makeNode(AccessPriv);=0A+=09=09=09=09n->priv_name=20=3D=20pstrdup("set=20= value");=0A+=09=09=09=09n->cols=20=3D=20NULL;=0A+=09=09=09=09$$=20=3D=20= n;=0A+=09=09=09}=0A+=09=09|=20ALTER=20SYSTEM_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("alter=20system");=0A+=09=09=09=09n->cols=20= =3D=20NULL;=0A+=09=09=09=09$$=20=3D=20n;=0A+=09=09=09}=0A=20=09=09|=20= ColId=20opt_column_list=0A=20=09=09=09{=0A=20=09=09=09=09AccessPriv=20*n=20= =3D=20makeNode(AccessPriv);=0A@@=20-7082,6=20+7140,27=20@@=20privilege:=09= SELECT=20opt_column_list=0A=20=09=09=09}=0A=20=09=09;=0A=20=0A= +setting_target:=0A+=09=09=09setting_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|=20= setting_target=20','=20setting_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+setting_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|=20setting_name=20'.'=20= ColId=0A+=09=09=09=09{=0A+=09=09=09=09=09$$=20=3D=20psprintf("%s.%s",=20= $1,=20$3);=0A+=09=09=09=09}=0A+=09=09;=0A=20=0A=20/*=20Don't=20bother=20= trying=20to=20fold=20the=20first=20two=20rules=20into=20one=20using=0A=20= =20*=20opt_table.=20=20You're=20going=20to=20get=20conflicts.=0A@@=20= -15912,6=20+15991,7=20@@=20unreserved_keyword:=0A=20=09=09=09|=20SESSION=0A= =20=09=09=09|=20SET=0A=20=09=09=09|=20SETS=0A+=09=09=09|=20SETTING=0A=20=09= =09=09|=20SHARE=0A=20=09=09=09|=20SHOW=0A=20=09=09=09|=20SIMPLE=0A@@=20= -16499,6=20+16579,7=20@@=20bare_label_keyword:=0A=20=09=09=09|=20SET=0A=20= =09=09=09|=20SETOF=0A=20=09=09=09|=20SETS=0A+=09=09=09|=20SETTING=0A=20=09= =09=09|=20SHARE=0A=20=09=09=09|=20SHOW=0A=20=09=09=09|=20SIMILAR=0Adiff=20= --git=20a/src/backend/utils/adt/acl.c=20b/src/backend/utils/adt/acl.c=0A= index=200a16f8156c..fa15f3155c=20100644=0A---=20= a/src/backend/utils/adt/acl.c=0A+++=20b/src/backend/utils/adt/acl.c=0A@@=20= -23,6=20+23,7=20@@=0A=20#include=20"catalog/pg_authid.h"=0A=20#include=20= "catalog/pg_class.h"=0A=20#include=20"catalog/pg_database.h"=0A+#include=20= "catalog/pg_setting_acl.h"=0A=20#include=20"catalog/pg_type.h"=0A=20= #include=20"commands/dbcommands.h"=0A=20#include=20"commands/proclang.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-109,6=20= +111,7=20@@=20static=20Oid=09convert_tablespace_name(text=20= *tablespacename);=0A=20static=20AclMode=20= convert_tablespace_priv_string(text=20*priv_type_text);=0A=20static=20= Oid=09convert_type_name(text=20*typename);=0A=20static=20AclMode=20= convert_type_priv_string(text=20*priv_type_text);=0A+static=20AclMode=20= convert_setting_priv_string(text=20*priv_setting_text);=0A=20static=20= AclMode=20convert_role_priv_string(text=20*priv_type_text);=0A=20static=20= AclResult=20pg_role_aclcheck(Oid=20role_oid,=20Oid=20roleid,=20AclMode=20= mode);=0A=20=0A@@=20-306,6=20+309,12=20@@=20aclparse(const=20char=20*s,=20= AclItem=20*aip)=0A=20=09=09=09case=20ACL_CONNECT_CHR:=0A=20=09=09=09=09= read=20=3D=20ACL_CONNECT;=0A=20=09=09=09=09break;=0A+=09=09=09case=20= ACL_SET_VALUE_CHR:=0A+=09=09=09=09read=20=3D=20ACL_SET_VALUE;=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+803,10=20@@=20= acldefault(ObjectType=20objtype,=20Oid=20ownerId)=0A=20=09=09=09= world_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_SETTING:=0A+=09=09=09world_default=20=3D=20ACL_NO_RIGHTS;=0A+=09=09= =09owner_default=20=3D=20ACL_ALL_RIGHTS_SETTING;=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=20= ACL_NO_RIGHTS;=09/*=20keep=20compiler=20quiet=20*/=0A@@=20-838,6=20= +851,41=20@@=20acldefault(ObjectType=20objtype,=20Oid=20ownerId)=0A=20=09= return=20acl;=0A=20}=0A=20=0A+/*=0A+=20*=20aclsettingdefault()=0A+=20*=0A= +=20*=20Creates=20and=20returns=20an=20ACL=20describing=20the=20default=20= access=20permissions=20for=20a=0A+=20*=20setting,=20taking=20into=20= account=20whether=20it=20is=20a=20PGC_USERSET=20GUC=20setting.=0A+=20*/=0A= +Acl=20*=0A+aclsettingdefault(bool=20is_userset)=0A+{=0A+=09Acl=09=09=20=20= =20*acl;=0A+=0A+=09/*=0A+=09=20*=20Treat=20all=20settings=20as=20= belonging=20to=20the=20bootstrap=20user.=20=20This=20works=0A+=09=20*=20= better=20than=20passing=20InvalidOid,=20as=20we=20want=20the=20bootstrap=20= user=20to=20retain=0A+=09=20*=20privileges=20even=20after=20running=20a=20= REVOKE=20..=20FROM=20PUBLIC=20on=20a=20default=20ACL.=0A+=09=20*/=0A+=09= acl=20=3D=20acldefault(OBJECT_SETTING,=20BOOTSTRAP_SUPERUSERID);=0A+=0A+=09= /*=0A+=09=20*=20Special=20case=20for=20USERSET=20gucs.=20=20By=20= default,=20public=20can=20SET=0A+=09=20*/=0A+=09if=20(is_userset)=0A+=09= {=0A+=09=09AclItem=20item;=0A+=0A+=09=09item.ai_grantee=20=3D=20= ACL_ID_PUBLIC;=0A+=09=09item.ai_grantor=20=3D=20BOOTSTRAP_SUPERUSERID;=0A= +=09=09item.ai_privs=20=3D=20ACL_SET_VALUE;=0A+=0A+=09=09acl=20=3D=20= aclupdate(acl,=20&item,=20ACL_MODECHG_ADD,=20BOOTSTRAP_SUPERUSERID,=0A+=09= =09=09=09=09=09DROP_RESTRICT);=0A+=09}=0A+=0A+=09return=20acl;=0A+}=0A=20= =0A=20/*=0A=20=20*=20SQL-accessible=20version=20of=20acldefault().=20=20= Hackish=20mapping=20from=20"char"=20type=20to=0A@@=20-895,6=20+943,17=20= @@=20acldefault_sql(PG_FUNCTION_ARGS)=0A=20=09= PG_RETURN_ACL_P(acldefault(objtype,=20owner));=0A=20}=0A=20=0A+/*=0A+=20= *=20SQL-accessible=20version=20of=20aclsettingdefault().=0A+=20*/=0A= +Datum=0A+aclsettingdefault_sql(PG_FUNCTION_ARGS)=0A+{=0A+=09const=20= char=20*setting=20=3D=20text_to_cstring(PG_GETARG_TEXT_P(0));=0A+=0A+=09= PG_RETURN_ACL_P(aclsettingdefault(find_option_context(setting)=20=3D=3D=0A= +=09=09=09=09=09=09=09=09=09=20=20PGC_USERSET));=0A+}=0A=20=0A=20/*=0A=20= =20*=20Update=20an=20ACL=20array=20to=20add=20or=20remove=20specified=20= privileges.=0A@@=20-1602,6=20+1661,10=20@@=20convert_priv_string(text=20= *priv_type_text)=0A=20=09=09return=20ACL_CREATE_TEMP;=0A=20=09if=20= (pg_strcasecmp(priv_type,=20"CONNECT")=20=3D=3D=200)=0A=20=09=09return=20= ACL_CONNECT;=0A+=09if=20(pg_strcasecmp(priv_type,=20"SET=20VALUE")=20=3D=3D= =200)=0A+=09=09return=20ACL_SET_VALUE;=0A+=09if=20= (pg_strcasecmp(priv_type,=20"ALTER=20SYSTEM")=20=3D=3D=200)=0A+=09=09= return=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=20= old=20RULE=20privileges=20*/=0A=20=0A@@=20-1698,6=20+1761,10=20@@=20= convert_aclright_to_string(int=20aclright)=0A=20=09=09=09return=20= "TEMPORARY";=0A=20=09=09case=20ACL_CONNECT:=0A=20=09=09=09return=20= "CONNECT";=0A+=09=09case=20ACL_SET_VALUE:=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= -4429,6=20+4496,193=20@@=20convert_type_priv_string(text=20= *priv_type_text)=0A=20=09return=20= convert_any_priv_string(priv_type_text,=20type_priv_map);=0A=20}=0A=20=0A= +/*=0A+=20*=20has_setting_privilege=20variants=0A+=20*=09=09These=20are=20= all=20named=20"has_setting_privilege"=20at=20the=20SQL=20level.=0A+=20*=09= =09They=20take=20various=20combinations=20of=20setting=20name,=20setting=20= OID,=0A+=20*=09=09user=20name,=20user=20OID,=20or=20implicit=20user=20=3D=20= current_user.=0A+=20*=0A+=20*=09=09The=20result=20is=20a=20boolean=20= value:=20true=20if=20user=20has=20the=20indicated=0A+=20*=09=09= privilege,=20false=20if=20not,=20or=20NULL=20if=20object=20doesn't=20= exist.=0A+=20*/=0A+=0A+/*=0A+=20*=20has_setting_privilege_name_name=0A+=20= *=09=09Check=20user=20privileges=20on=20a=20setting=20given=0A+=20*=09=09= name=20username,=20text=20setting,=20and=20text=20priv=20name.=0A+=20*/=0A= +Datum=0A+has_setting_privilege_name_name(PG_FUNCTION_ARGS)=0A+{=0A+=09= Name=09=09username=20=3D=20PG_GETARG_NAME(0);=0A+=09text=09=20=20=20= *setting=20=3D=20PG_GETARG_TEXT_PP(1);=0A+=09text=09=20=20=20= *priv_setting_text=20=3D=20PG_GETARG_TEXT_PP(2);=0A+=09Oid=09=09=09= roleid;=0A+=09Oid=09=09=09settingoid;=0A+=09AclMode=09=09mode;=0A+=09= AclResult=09aclresult;=0A+=0A+=09roleid=20=3D=20= get_role_oid_or_public(NameStr(*username));=0A+=0A+=09settingoid=20=3D=20= get_setting_oid(text_to_cstring(setting),=20true);=0A+=09if=20= (!OidIsValid(settingoid))=0A+=09=09PG_RETURN_NULL();=0A+=09mode=20=3D=20= convert_setting_priv_string(priv_setting_text);=0A+=0A+=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A+=0A+=09= PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A+=20*=20= has_setting_privilege_name=0A+=20*=09=09Check=20user=20privileges=20on=20= a=20setting=20given=0A+=20*=09=09text=20setting=20and=20text=20priv=20= name.=0A+=20*=09=09current_user=20is=20assumed=0A+=20*/=0A+Datum=0A= +has_setting_privilege_name(PG_FUNCTION_ARGS)=0A+{=0A+=09text=09=20=20=20= *setting=20=3D=20PG_GETARG_TEXT_PP(0);=0A+=09text=09=20=20=20= *priv_setting_text=20=3D=20PG_GETARG_TEXT_PP(1);=0A+=09Oid=09=09=09= roleid;=0A+=09Oid=09=09=09settingoid;=0A+=09AclMode=09=09mode;=0A+=09= AclResult=09aclresult;=0A+=0A+=09roleid=20=3D=20GetUserId();=0A+=09= settingoid=20=3D=20get_setting_oid(text_to_cstring(setting),=20true);=0A= +=09if=20(!OidIsValid(settingoid))=0A+=09=09PG_RETURN_NULL();=0A+=09mode=20= =3D=20convert_setting_priv_string(priv_setting_text);=0A+=0A+=09= aclresult=20=3D=20pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A= +=0A+=09PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A= +=20*=20has_setting_privilege_name_id=0A+=20*=09=09Check=20user=20= privileges=20on=20a=20setting=20given=0A+=20*=09=09name=20usename,=20= setting=20oid,=20and=20text=20priv=20name.=0A+=20*/=0A+Datum=0A= +has_setting_privilege_name_id(PG_FUNCTION_ARGS)=0A+{=0A+=09Name=09=09= username=20=3D=20PG_GETARG_NAME(0);=0A+=09Oid=09=09=09settingoid=20=3D=20= PG_GETARG_OID(1);=0A+=09text=09=20=20=20*priv_setting_text=20=3D=20= PG_GETARG_TEXT_PP(2);=0A+=09Oid=09=09=09roleid;=0A+=09AclMode=09=09mode;=0A= +=09AclResult=09aclresult;=0A+=0A+=09roleid=20=3D=20= get_role_oid_or_public(NameStr(*username));=0A+=09mode=20=3D=20= convert_setting_priv_string(priv_setting_text);=0A+=0A+=09if=20= (!SearchSysCacheExists1(SETTINGOID,=20ObjectIdGetDatum(settingoid)))=0A+=09= =09PG_RETURN_NULL();=0A+=0A+=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A+=0A+=09= PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A+=20*=20= has_setting_privilege_id=0A+=20*=09=09Check=20user=20privileges=20on=20a=20= setting=20given=0A+=20*=09=09setting=20oid,=20and=20text=20priv=20name.=0A= +=20*=09=09current_user=20is=20assumed=0A+=20*/=0A+Datum=0A= +has_setting_privilege_id(PG_FUNCTION_ARGS)=0A+{=0A+=09Oid=09=09=09= settingoid=20=3D=20PG_GETARG_OID(0);=0A+=09text=09=20=20=20= *priv_setting_text=20=3D=20PG_GETARG_TEXT_PP(1);=0A+=09Oid=09=09=09= roleid;=0A+=09AclMode=09=09mode;=0A+=09AclResult=09aclresult;=0A+=0A+=09= roleid=20=3D=20GetUserId();=0A+=09mode=20=3D=20= convert_setting_priv_string(priv_setting_text);=0A+=0A+=09if=20= (!SearchSysCacheExists1(SETTINGOID,=20ObjectIdGetDatum(settingoid)))=0A+=09= =09PG_RETURN_NULL();=0A+=0A+=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A+=0A+=09= PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A+=20*=20= has_setting_privilege_id_name=0A+=20*=09=09Check=20user=20privileges=20= on=20a=20setting=20given=0A+=20*=09=09roleid,=20text=20setting,=20and=20= text=20priv=20name.=0A+=20*/=0A+Datum=0A= +has_setting_privilege_id_name(PG_FUNCTION_ARGS)=0A+{=0A+=09Oid=09=09=09= roleid=20=3D=20PG_GETARG_OID(0);=0A+=09text=09=20=20=20*setting=20=3D=20= PG_GETARG_TEXT_PP(1);=0A+=09text=09=20=20=20*priv_setting_text=20=3D=20= PG_GETARG_TEXT_PP(2);=0A+=09Oid=09=09=09settingoid;=0A+=09AclMode=09=09= mode;=0A+=09AclResult=09aclresult;=0A+=0A+=09settingoid=20=3D=20= get_setting_oid(text_to_cstring(setting),=20true);=0A+=09if=20= (!OidIsValid(settingoid))=0A+=09=09PG_RETURN_NULL();=0A+=09mode=20=3D=20= convert_setting_priv_string(priv_setting_text);=0A+=0A+=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A+=0A+=09= PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A+=20*=20= has_setting_privilege_id_id=0A+=20*=09=09Check=20user=20privileges=20on=20= a=20setting=20given=0A+=20*=09=09roleid,=20setting=20oid,=20and=20text=20= priv=20name.=0A+=20*/=0A+Datum=0A= +has_setting_privilege_id_id(PG_FUNCTION_ARGS)=0A+{=0A+=09Oid=09=09=09= roleid=20=3D=20PG_GETARG_OID(0);=0A+=09Oid=09=09=09settingoid=20=3D=20= PG_GETARG_OID(1);=0A+=09text=09=20=20=20*priv_setting_text=20=3D=20= PG_GETARG_TEXT_PP(2);=0A+=09AclMode=09=09mode;=0A+=09AclResult=09= aclresult;=0A+=0A+=09mode=20=3D=20= convert_setting_priv_string(priv_setting_text);=0A+=0A+=09if=20= (!SearchSysCacheExists1(SETTINGOID,=20ObjectIdGetDatum(settingoid)))=0A+=09= =09PG_RETURN_NULL();=0A+=0A+=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingoid,=20roleid,=20mode);=0A+=0A+=09= PG_RETURN_BOOL(aclresult=20=3D=3D=20ACLCHECK_OK);=0A+}=0A+=0A+/*=0A+=20*=09= =09Support=20routines=20for=20has_setting_privilege=20family.=0A+=20*/=0A= +=0A+/*=0A+=20*=20convert_setting_priv_string=0A+=20*=09=09Convert=20= text=20string=20to=20AclMode=20value.=0A+=20*/=0A+static=20AclMode=0A= +convert_setting_priv_string(text=20*priv_setting_text)=0A+{=0A+=09= static=20const=20priv_map=20setting_priv_map[]=20=3D=20{=0A+=09=09{"SET=20= VALUE",=20ACL_SET_VALUE},=0A+=09=09{"SET=20VALUE=20WITH=20GRANT=20= OPTION",=20ACL_GRANT_OPTION_FOR(ACL_SET_VALUE)},=0A+=09=09{"ALTER=20= SYSTEM",=20ACL_ALTER_SYSTEM},=0A+=09=09{"ALTER=20SYSTEM=20WITH=20GRANT=20= OPTION",=20ACL_GRANT_OPTION_FOR(ACL_ALTER_SYSTEM)},=0A+=09=09{NULL,=200}=0A= +=09};=0A+=0A+=09return=20convert_any_priv_string(priv_setting_text,=20= setting_priv_map);=0A+}=0A=20=0A=20/*=0A=20=20*=20pg_has_role=20variants=0A= @@=20-4670,6=20+4924,43=20@@=20initialize_acl(void)=0A=20=09}=0A=20}=0A=20= =0A+/*=0A+=20*=20get_setting_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_setting_oid(const=20char=20*setting,=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(SETTINGNAME,=20Anum_pg_setting_acl_oid,=0A+=09=09=09=09=09= =09=20=20PointerGetDatum(cstring_to_text(setting)));=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(setting);=0A+=09=09if=20(canonical=20!=3D=20= NULL)=0A+=09=09=09oid=20=3D=20GetSysCacheOid1(SETTINGNAME,=20= Anum_pg_setting_acl_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("setting=20\"%s\"=20does=20not=20exist",=20setting)));=0A+=09}=0A= +=0A+=09return=20oid;=0A+}=0A+=0A=20/*=0A=20=20*=20= RoleMembershipCacheCallback=0A=20=20*=09=09Syscache=20inval=20callback=20= function=0Adiff=20--git=20a/src/backend/utils/cache/lsyscache.c=20= b/src/backend/utils/cache/lsyscache.c=0Aindex=20feef999863..f4e806fe8e=20= 100644=0A---=20a/src/backend/utils/cache/lsyscache.c=0A+++=20= b/src/backend/utils/cache/lsyscache.c=0A@@=20-32,6=20+32,7=20@@=0A=20= #include=20"catalog/pg_operator.h"=0A=20#include=20"catalog/pg_proc.h"=0A= =20#include=20"catalog/pg_range.h"=0A+#include=20= "catalog/pg_setting_acl.h"=0A=20#include=20"catalog/pg_statistic.h"=0A=20= #include=20"catalog/pg_transform.h"=0A=20#include=20"catalog/pg_type.h"=0A= @@=20-3304,6=20+3305,25=20@@=20free_attstatsslot(AttStatsSlot=20*sslot)=0A= =20=09=09pfree(sslot->numbers_arr);=0A=20}=0A=20=0A+char=20*=0A= +get_setting_name(Oid=20configid)=0A+{=0A+=09HeapTuple=09tp;=0A+=0A+=09= tp=20=3D=20SearchSysCache1(SETTINGOID,=20ObjectIdGetDatum(configid));=0A= +=09if=20(HeapTupleIsValid(tp))=0A+=09{=0A+=09=09Form_pg_setting_acl=20= configtup=20=3D=20(Form_pg_setting_acl)=20GETSTRUCT(tp);=0A+=09=09char=09= =20=20=20*result;=0A+=0A+=09=09result=20=3D=20= pstrdup(text_to_cstring(&configtup->setting));=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=20f4e7819f1e..cbcbf02839=20= 100644=0A---=20a/src/backend/utils/cache/syscache.c=0A+++=20= b/src/backend/utils/cache/syscache.c=0A@@=20-57,6=20+57,7=20@@=0A=20= #include=20"catalog/pg_rewrite.h"=0A=20#include=20= "catalog/pg_seclabel.h"=0A=20#include=20"catalog/pg_sequence.h"=0A= +#include=20"catalog/pg_setting_acl.h"=0A=20#include=20= "catalog/pg_shdepend.h"=0A=20#include=20"catalog/pg_shdescription.h"=0A=20= #include=20"catalog/pg_shseclabel.h"=0A@@=20-762,6=20+763,28=20@@=20= static=20const=20struct=20cachedesc=20cacheinfo[]=20=3D=20{=0A=20=09=09= },=0A=20=09=0932=0A=20=09},=0A+=09{SettingAclRelationId,=09=09/*=20= SETTINGNAME=20*/=0A+=09=09SettingAclSettingIndexId,=0A+=09=091,=0A+=09=09= {=0A+=09=09=09Anum_pg_setting_acl_setting,=0A+=09=09=090,=0A+=09=09=090,=0A= +=09=09=090=0A+=09=09},=0A+=09=094=0A+=09},=0A+=09{SettingAclRelationId,=09= =09/*=20SETTINGOID=20*/=0A+=09=09SettingAclOidIndexId,=0A+=09=091,=0A+=09= =09{=0A+=09=09=09Anum_pg_setting_acl_oid,=0A+=09=09=090,=0A+=09=09=090,=0A= +=09=09=090=0A+=09=09},=0A+=09=094=0A+=09},=0A=20=09= {StatisticExtDataRelationId,=09/*=20STATEXTDATASTXOID=20*/=0A=20=09=09= StatisticExtDataStxoidInhIndexId,=0A=20=09=092,=0Adiff=20--git=20= a/src/backend/utils/misc/guc.c=20b/src/backend/utils/misc/guc.c=0Aindex=20= 6d11f9c71b..e64d0b2564=20100644=0A---=20a/src/backend/utils/misc/guc.c=0A= +++=20b/src/backend/utils/misc/guc.c=0A@@=20-43,7=20+43,9=20@@=0A=20= #include=20"access/xlog_internal.h"=0A=20#include=20= "access/xlogrecovery.h"=0A=20#include=20"catalog/namespace.h"=0A= +#include=20"catalog/objectaccess.h"=0A=20#include=20= "catalog/pg_authid.h"=0A+#include=20"catalog/pg_setting_acl.h"=0A=20= #include=20"catalog/storage.h"=0A=20#include=20"commands/async.h"=0A=20= #include=20"commands/prepare.h"=0A@@=20-5053,6=20+5055,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_setting_acl=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-5452,25=20+5458,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-5487,8=20+5497,25=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+/*=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-7542,6=20+7569,24=20@@=20= set_config_option(const=20char=20*name,=20const=20char=20*value,=0A=20=09= =09case=20PGC_SUSET:=0A=20=09=09=09if=20(context=20=3D=3D=20PGC_USERSET=20= ||=20context=20=3D=3D=20PGC_BACKEND)=0A=20=09=09=09{=0A+=09=09=09=09/*=0A= +=09=09=09=09=20*=20Check=20whether=20the=20current=20user=20has=20= granted=20privilege=20to=20set=0A+=09=09=09=09=20*=20this=20GUC.=0A+=09=09= =09=09=20*/=0A+=09=09=09=09Oid=09=09=09settingid=20=3D=20= get_setting_oid(name,=20true);=0A+=0A+=09=09=09=09if=20= (OidIsValid(settingid))=0A+=09=09=09=09{=0A+=09=09=09=09=09AclResult=09= aclresult;=0A+=0A+=09=09=09=09=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingid,=20GetUserId(),=0A+=09=09=09=09=09=09=09= =09=09=09=09=09=09=09ACL_SET_VALUE);=0A+=0A+=09=09=09=09=09if=20= (aclresult=20=3D=3D=20ACLCHECK_OK)=0A+=09=09=09=09=09=09break;=09=09/*=20= okay=20*/=0A+=09=09=09=09}=0A+=0A+=09=09=09=09/*=20No=20granted=20= privilege=20*/=0A=20=09=09=09=09ereport(elevel,=0A=20=09=09=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A=20=09=09=09=09=09=09=20= errmsg("permission=20denied=20to=20set=20parameter=20\"%s\"",=0A@@=20= -7550,7=20+7595,35=20@@=20set_config_option(const=20char=20*name,=20= const=20char=20*value,=0A=20=09=09=09}=0A=20=09=09=09break;=0A=20=09=09= case=20PGC_USERSET:=0A-=09=09=09/*=20always=20okay=20*/=0A+=09=09=09if=20= (context=20=3D=3D=20PGC_USERSET)=0A+=09=09=09{=0A+=09=09=09=09/*=0A+=09=09= =09=09=20*=20If=20this=20GUC=20setting=20has=20an=20entry=20in=20= pg_setting_acl,=20then=20the=0A+=09=09=09=09=20*=20current=20user=20must=20= have=20privileges=20per=20the=20acl=20to=20set=20this=20guc.=0A+=09=09=09= =09=20*=20Otherwise,=20all=20users=20are=20implicitly=20allowed=20to=20= set=20it.=0A+=09=09=09=09=20*/=0A+=09=09=09=09Oid=09=09=09settingid=20=3D=20= get_setting_oid(name,=20true);=0A+=0A+=09=09=09=09if=20= (OidIsValid(settingid))=0A+=09=09=09=09{=0A+=09=09=09=09=09AclResult=09= aclresult;=0A+=0A+=09=09=09=09=09aclresult=20=3D=20= pg_setting_acl_aclcheck(settingid,=20GetUserId(),=0A+=09=09=09=09=09=09=09= =09=09=09=09=09=09=09ACL_SET_VALUE);=0A+=0A+=09=09=09=09=09if=20= (aclresult=20=3D=3D=20ACLCHECK_OK)=0A+=09=09=09=09=09=09break;=09=09/*=20= okay=20*/=0A+=0A+=09=09=09=09=09/*=20No=20granted=20privilege=20*/=0A+=09= =09=09=09=09ereport(elevel,=0A+=09=09=09=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=09=09=09=20= errmsg("permission=20denied=20to=20set=20parameter=20\"%s\"",=0A+=09=09=09= =09=09=09=09=09=09name)));=0A+=09=09=09=09=09return=200;=0A+=09=09=09=09= }=0A+=0A+=09=09=09=09/*=20No=20pg_setting_acl=20entry,=20okay=20*/=0A+=09= =09=09}=0A=20=09=09=09break;=0A=20=09}=0A=20=0A@@=20-8140,6=20+8213,23=20= @@=20set_config_option(const=20char=20*name,=20const=20char=20*value,=0A=20= }=0A=20=0A=20=0A+/*=0A+=20*=20Get=20the=20context=20required=20to=20set=20= the=20variable,=20or=20-1=20if=20the=20given=20name=20cannot=0A+=20*=20= be=20found.=0A+=20*/=0A+GucContext=0A+find_option_context(const=20char=20= *name)=0A+{=0A+=09struct=20config_generic=20*conf;=0A+=0A+=09conf=20=3D=20= find_option(name,=20false,=20false,=20ERROR);=0A+=09if=20(conf)=0A+=09=09= return=20conf->context;=0A+=0A+=09return=20-1;=09=20/*=20Not=20reached=20= */=0A+}=0A+=0A+=0A=20/*=0A=20=20*=20Set=20the=20fields=20for=20source=20= file=20and=20line=20number=20the=20setting=20came=20from.=0A=20=20*/=0A= @@=20-8584,6=20+8674,7=20@@=20AlterSystemSetConfigFile(AlterSystemStmt=20= *altersysstmt)=0A=20{=0A=20=09char=09=20=20=20*name;=0A=20=09char=09=20=20= =20*value;=0A+=09Oid=09=09=09settingId=20=3D=20InvalidOid;=0A=20=09bool=09= =09resetall=20=3D=20false;=0A=20=09ConfigVariable=20*head=20=3D=20NULL;=0A= =20=09ConfigVariable=20*tail=20=3D=20NULL;=0A@@=20-8591,16=20+8682,31=20= @@=20AlterSystemSetConfigFile(AlterSystemStmt=20*altersysstmt)=0A=20=09= char=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+=0A+=09=09settingId=20=3D=20= get_setting_oid(name,=20true);=0A+=09=09if=20(!OidIsValid(settingId))=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_setting_acl_aclcheck(settingId,=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,=20OBJECT_SETTING,=20= name);=0A+=09}=0A+=0A=20=09switch=20(altersysstmt->setstmt->kind)=0A=20=09= {=0A=20=09=09case=20VAR_SET_VALUE:=0A@@=20-8733,6=20+8839,21=20@@=20= AlterSystemSetConfigFile(AlterSystemStmt=20*altersysstmt)=0A=20=09=09= replace_auto_config_value(&head,=20&tail,=20name,=20value);=0A=20=09}=0A=20= =0A+=09/*=0A+=09=20*=20Invoke=20the=20post-alter=20hook=20for=20setting=20= this=20GUC=20variable.=20=20Guc=20variables=0A+=09=20*=20do=20not=20= always=20have=20corresponding=20entries=20in=20pg_setting_acl;=20the=20= hooks=0A+=09=20*=20must=20therefore=20be=20prepared=20to=20receive=20= settingId=20=3D=20InvalidOid.=20=20We=20also=0A+=09=20*=20abuse=20the=20= notion=20of=20subId=20to=20pass=20the=20kind=20of=20alteration=20(set=20= vs.=20alter=0A+=09=20*=20system),=20and=20auxiliaryId=20to=20pass=20the=20= VariableSetKind.=0A+=09=20*=0A+=09=20*=20We=20do=20this=20here=20rather=20= than=20at=20the=20end,=20because=20ALTER=20SYSTEM=20is=20not=0A+=09=20*=20= transactional.=20=20If=20the=20hook=20aborts=20our=20transaction,=20it=20= will=20be=20cleaner=0A+=09=20*=20to=20do=20so=20before=20we=20touch=20= any=20files.=0A+=09=20*/=0A+=09= InvokeObjectPostAlterHookArg(SettingAclRelationId,=20settingId,=0A+=09=09= =09=09=09=09=09=09=20ACL_ALTER_SYSTEM,=20altersysstmt->setstmt->kind,=0A= +=09=09=09=09=09=09=09=09=20false);=0A+=0A=20=09/*=0A=20=09=20*=20To=20= ensure=20crash=20safety,=20first=20write=20the=20new=20file=20data=20to=20= a=20temp=20file,=0A=20=09=20*=20then=20atomically=20rename=20it=20into=20= place.=0A@@=20-8793,6=20+8914,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=09settingId;=0A=20=0A=20=09/*=0A=20=09=20*=20= Workers=20synchronize=20these=20parameters=20at=20the=20start=20of=20the=20= parallel=0A@@=20-8803,6=20+8927,24=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/*=20Get=20the=20Oid=20of=20this=20setting,=20= or=20InvalidOid=20if=20none.=20*/=0A+=09settingId=20=3D=20= get_setting_oid(stmt->name,=20true);=0A+=0A+=09/*=0A+=09=20*=20= Superusers=20and=20users=20who=20have=20been=20granted=20SET=20privilege=20= can=20set=20with=0A+=09=20*=20PGC_SUSET=20context.=20=20All=20others=20= have=20only=20PGC_USERSET.=0A+=09=20*/=0A+=09context=20=3D=20= PGC_USERSET;=0A+=09if=20(superuser())=0A+=09=09context=20=3D=20= PGC_SUSET;=0A+=09else=20if=20(OidIsValid(settingId))=0A+=09{=0A+=09=09= aclresult=20=3D=20pg_setting_acl_aclcheck(settingId,=20GetUserId(),=0A+=09= =09=09=09=09=09=09=09=09=09=09ACL_SET_VALUE);=0A+=09=09if=20(aclresult=20= =3D=3D=20ACLCHECK_OK)=0A+=09=09=09context=20=3D=20PGC_SUSET;=0A+=09}=0A+=0A= =20=09switch=20(stmt->kind)=0A=20=09{=0A=20=09=09case=20VAR_SET_VALUE:=0A= @@=20-8811,7=20+8953,7=20@@=20ExecSetVariableStmt(VariableSetStmt=20= *stmt,=20bool=20isTopLevel)=0A=20=09=09=09=09= WarnNoTransactionBlock(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=20= ExtractSetVariableArgs(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-8896,7=20+9038,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= -8904,6=20+9046,16=20@@=20ExecSetVariableStmt(VariableSetStmt=20*stmt,=20= bool=20isTopLevel)=0A=20=09=09=09ResetAllOptions();=0A=20=09=09=09break;=0A= =20=09}=0A+=0A+=09/*=0A+=09=20*=20Invoke=20the=20post-alter=20hook=20for=20= setting=20this=20GUC=20variable.=20=20Guc=20variables=0A+=09=20*=20do=20= not=20always=20have=20corresponding=20entries=20in=20pg_setting_acl;=20= the=20hooks=0A+=09=20*=20must=20therefore=20be=20prepared=20to=20receive=20= settingId=20=3D=20InvalidOid.=20=20We=20also=0A+=09=20*=20abuse=20the=20= notion=20of=20subId=20to=20pass=20the=20kind=20of=20alteration=20(set=20= vs.=20alter=0A+=09=20*=20system),=20and=20auxiliaryId=20to=20pass=20the=20= VariableSetKind.=0A+=09=20*/=0A+=09= InvokeObjectPostAlterHookArg(SettingAclRelationId,=20settingId,=0A+=09=09= =09=09=09=09=09=09=20ACL_SET_VALUE,=20stmt->kind,=20false);=0A=20}=0A=20=0A= =20/*=0A@@=20-9664,6=20+9816,22=20@@=20get_explain_guc_options(int=20= *num)=0A=20=09return=20result;=0A=20}=0A=20=0A+/*=0A+=20*=20Return=20GUC=20= variable=20canonical=20name,=20or=20NULL=20if=20no=20variable=20by=20the=20= given=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=206086d57cf3..a84efd79e5=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= SETTING=20or=20LARGE=20OBJECT)=0A=20=20*=09acls:=20the=20ACL=20string=20= fetched=20from=20the=20database=0A=20=20*=09baseacls:=20the=20initial=20= ACL=20string=20for=20this=20object=0A=20=20*=09owner:=20username=20of=20= object=20owner=20(will=20be=20passed=20through=20fmtId);=20can=20be=0A@@=20= -501,6=20+501,11=20@@=20do=20{=20\=0A=20=09=09CONVERT_PRIV('U',=20= "USAGE");=0A=20=09else=20if=20(strcmp(type,=20"FOREIGN=20TABLE")=20=3D=3D=20= 0)=0A=20=09=09CONVERT_PRIV('r',=20"SELECT");=0A+=09else=20if=20= (strcmp(type,=20"SETTING")=20=3D=3D=200)=0A+=09{=0A+=09=09= CONVERT_PRIV('s',=20"SET=20VALUE");=0A+=09=09CONVERT_PRIV('A',=20"ALTER=20= SYSTEM");=0A+=09}=0A=20=09else=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=20a/src/bin/pg_dump/pg_backup_archiver.c=20= b/src/bin/pg_dump/pg_backup_archiver.c=0Aindex=20d41a99d6ea..bb0badca65=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-3435,6=20+3435,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"SETTING")=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=09= strcmp(type,=20"SUBSCRIPTION")=20=3D=3D=200=20||=0A@@=20-3618,6=20= +3619,7=20@@=20_printTocEntry(ArchiveHandle=20*AH,=20TocEntry=20*te,=20= bool=20isData)=0A=20=09=09=09strcmp(te->desc,=20"TEXT=20SEARCH=20= DICTIONARY")=20=3D=3D=200=20||=0A=20=09=09=09strcmp(te->desc,=20"TEXT=20= SEARCH=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"SETTING")=20=3D=3D=200=20||=0A=20=09=09=09= strcmp(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= e69dcf8a48..dea1b89ff8=20100644=0A---=20a/src/bin/pg_dump/pg_dump.c=0A= +++=20b/src/bin/pg_dump/pg_dump.c=0A@@=20-14166,6=20+14166,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_SETTING:=0A+=09=09=09type=20= =3D=20"SETTINGS";=0A+=09=09=09break;=0A=20=09=09default:=0A=20=09=09=09= /*=20shouldn't=20get=20here=20*/=0A=20=09=09=09fatal("unrecognized=20= object=20type=20in=20default=20privileges:=20%d",=0A@@=20-14209,7=20= +14212,7=20@@=20dumpDefaultACL(Archive=20*fout,=20const=20DefaultACLInfo=20= *daclinfo)=0A=20=20*=09=09or=20InvalidDumpId=20if=20there=20is=20no=20= need=20for=20a=20second=20dependency.=0A=20=20*=20'type'=20must=20be=20= one=20of=0A=20=20*=09=09TABLE,=20SEQUENCE,=20FUNCTION,=20LANGUAGE,=20= SCHEMA,=20DATABASE,=20TABLESPACE,=0A-=20*=09=09FOREIGN=20DATA=20WRAPPER,=20= SERVER,=20or=20LARGE=20OBJECT.=0A+=20*=09=09FOREIGN=20DATA=20WRAPPER,=20= SERVER,=20SETTING=20or=20LARGE=20OBJECT.=0A=20=20*=20'name'=20is=20the=20= formatted=20name=20of=20the=20object.=20=20Must=20be=20quoted=20etc.=20= already.=0A=20=20*=20'subname'=20is=20the=20formatted=20name=20of=20the=20= sub-object,=20if=20any.=20=20Must=20be=20quoted.=0A=20=20*=09=09= (Currently=20we=20assume=20that=20subname=20is=20only=20provided=20for=20= table=20columns.)=0Adiff=20--git=20a/src/bin/pg_dump/pg_dumpall.c=20= b/src/bin/pg_dump/pg_dumpall.c=0Aindex=209c9f7c6d63..ecb6a45a5f=20100644=0A= ---=20a/src/bin/pg_dump/pg_dumpall.c=0A+++=20= b/src/bin/pg_dump/pg_dumpall.c=0A@@=20-36,6=20+36,7=20@@=20static=20void=20= help(void);=0A=20static=20void=20dropRoles(PGconn=20*conn);=0A=20static=20= void=20dumpRoles(PGconn=20*conn);=0A=20static=20void=20= dumpRoleMembership(PGconn=20*conn);=0A+static=20void=20= dumpRoleGUCPrivs(PGconn=20*conn);=0A=20static=20void=20= dropTablespaces(PGconn=20*conn);=0A=20static=20void=20= dumpTablespaces(PGconn=20*conn);=0A=20static=20void=20dropDBs(PGconn=20= *conn);=0A@@=20-585,6=20+586,10=20@@=20main(int=20argc,=20char=20= *argv[])=0A=20=0A=20=09=09=09/*=20Dump=20role=20memberships=20*/=0A=20=09= =09=09dumpRoleMembership(conn);=0A+=0A+=09=09=09/*=20Dump=20role=20guc=20= privileges=20*/=0A+=09=09=09if=20(server_version=20>=3D=20150000)=0A+=09=09= =09=09dumpRoleGUCPrivs(conn);=0A=20=09=09}=0A=20=0A=20=09=09/*=20Dump=20= tablespaces=20*/=0A@@=20-1024,6=20+1029,62=20@@=20dropTablespaces(PGconn=20= *conn)=0A=20=09fprintf(OPF,=20"\n\n");=0A=20}=0A=20=0A+/*=0A+=20*=20Dump=20= role=20configuration=20parameter=20privileges.=20=20This=20code=20is=20= used=20for=2015.0=0A+=20*=20and=20later=20servers.=0A+=20*=0A+=20*=20= Note:=20we=20expect=20dumpRoles=20already=20created=20all=20the=20roles,=20= but=20there=20are=0A+=20*=20no=20per-role=20configuration=20parameter=20= privileges=20yet..=0A+=20*/=0A+static=20void=0A+dumpRoleGUCPrivs(PGconn=20= *conn)=0A+{=0A+=09PGresult=20=20=20*res;=0A+=09int=09=09=09i;=0A+=0A+=09= /*=0A+=09=20*=20Get=20all=20settings=20which=20have=20non-default=20acls=20= defined.=0A+=09=20*/=0A+=09res=20=3D=20executeQuery(conn,=20"SELECT=20= setting,=20"=0A+=09=09=09=09=09=20=20=20"pg_catalog.pg_get_userbyid(10)=20= AS=20setowner,=20"=0A+=09=09=09=09=09=20=20=20"setacl,=20= aclsettingdefault(setting)=20AS=20acldefault=20"=0A+=09=09=09=09=09=20=20= =20"FROM=20pg_catalog.pg_setting_acl=20"=0A+=09=09=09=09=09=20=20=20= "ORDER=20BY=20oid");=0A+=0A+=09fprintf(OPF,=20"--\n--=20Role=20= privileges=20on=20configuration=20parameters\n--\n\n");=0A+=0A+=09for=20= (i=20=3D=200;=20i=20<=20PQntuples(res);=20i++)=0A+=09{=0A+=09=09= PQExpBuffer=20buf=20=3D=20createPQExpBuffer();=0A+=09=09char=09=20=20=20= *setting=20=3D=20PQgetvalue(res,=20i,=200);=0A+=09=09char=09=20=20=20= *setowner=20=3D=20PQgetvalue(res,=20i,=201);=0A+=09=09char=09=20=20=20= *setacl=20=3D=20PQgetvalue(res,=20i,=202);=0A+=09=09char=09=20=20=20= *acldefault=20=3D=20PQgetvalue(res,=20i,=203);=0A+=09=09char=09=20=20=20= *fsetting;=0A+=0A+=09=09/*=20needed=20for=20buildACLCommands()=20*/=0A+=09= =09fsetting=20=3D=20pg_strdup(fmtId(setting));=0A+=0A+=09=09if=20= (!buildACLCommands(fsetting,=20NULL,=20NULL,=20"SETTING",=0A+=09=09=09=09= =09=09=09=20=20setacl,=20acldefault,=0A+=09=09=09=09=09=09=09=20=20= setowner,=20"",=20server_version,=20buf))=0A+=09=09{=0A+=09=09=09= pg_log_error("could=20not=20parse=20ACL=20list=20(%s)=20for=20tablespace=20= \"%s\"",=0A+=09=09=09=09=09=09=20setacl,=20setting);=0A+=09=09=09= PQfinish(conn);=0A+=09=09=09exit_nicely(1);=0A+=09=09}=0A+=0A+=09=09= fprintf(OPF,=20"%s",=20buf->data);=0A+=0A+=09=09free(fsetting);=0A+=09=09= destroyPQExpBuffer(buf);=0A+=09}=0A+=0A+=09PQclear(res);=0A+=09= fprintf(OPF,=20"\n\n");=0A+}=0A+=0A=20/*=0A=20=20*=20Dump=20tablespaces.=0A= =20=20*/=0Adiff=20--git=20a/src/bin/psql/tab-complete.c=20= b/src/bin/psql/tab-complete.c=0Aindex=206957567264..c259dcf79f=20100644=0A= ---=20a/src/bin/psql/tab-complete.c=0A+++=20= b/src/bin/psql/tab-complete.c=0A@@=20-3672,7=20+3672,11=20@@=20= psql_completion(const=20char=20*text,=20int=20start,=20int=20end)=0A=20=20= *=20ALTER=20DEFAULT=20PRIVILEGES,=20so=20use=20TailMatches=0A=20=20*/=0A=20= =09/*=20Complete=20GRANT/REVOKE=20with=20a=20list=20of=20roles=20and=20= privileges=20*/=0A-=09else=20if=20(TailMatches("GRANT|REVOKE"))=0A+=09= else=20if=20(TailMatches("REVOKE",=20"GRANT"))=0A+=09=09= COMPLETE_WITH("OPTION=20FOR");=0A+=09else=20if=20(TailMatches("REVOKE",=20= "GRANT",=20"OPTION"))=0A+=09=09COMPLETE_WITH("FOR");=0A+=09else=20if=20= (TailMatches("REVOKE"))=0A=20=09{=0A=20=09=09/*=0A=20=09=09=20*=20With=20= ALTER=20DEFAULT=20PRIVILEGES,=20restrict=20completion=20to=20grantable=0A= @@=20-3684,8=20+3688,11=20@@=20psql_completion(const=20char=20*text,=20= int=20start,=20int=20end)=0A=20=09=09=09=09=09=09=20=20"EXECUTE",=20= "USAGE",=20"ALL");=0A=20=09=09else=0A=20=09=09=09= COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,=0A+=09=09=09=09=09=09=09= =09=09=20"ALTER",=0A=20=09=09=09=09=09=09=09=09=09=20"SELECT",=0A+=09=09=09= =09=09=09=09=09=09=20"SET",=0A=20=09=09=09=09=09=09=09=09=09=20"INSERT",=0A= +=09=09=09=09=09=09=09=09=09=20"GRANT",=0A=20=09=09=09=09=09=09=09=09=09=20= "UPDATE",=0A=20=09=09=09=09=09=09=09=09=09=20"DELETE",=0A=20=09=09=09=09=09= =09=09=09=09=20"TRUNCATE",=0A@@=20-3698,12=20+3705,146=20@@=20= psql_completion(const=20char=20*text,=20int=20start,=20int=20end)=0A=20=09= =09=09=09=09=09=09=09=09=20"USAGE",=0A=20=09=09=09=09=09=09=09=09=09=20= "ALL");=0A=20=09}=0A+=09else=20if=20(TailMatches("GRANT")=20||=0A+=09=09=09= =20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR"))=0A+=09{=0A+=09=09= /*=0A+=09=09=20*=20With=20ALTER=20DEFAULT=20PRIVILEGES,=20restrict=20= completion=20to=20grantable=0A+=09=09=20*=20privileges=20(can't=20grant=20= roles)=0A+=09=09=20*/=0A+=09=09if=20(HeadMatches("ALTER",=20"DEFAULT",=20= "PRIVILEGES"))=0A+=09=09=09COMPLETE_WITH("SELECT",=20"INSERT",=20= "UPDATE",=0A+=09=09=09=09=09=09=20=20"DELETE",=20"TRUNCATE",=20= "REFERENCES",=20"TRIGGER",=0A+=09=09=09=09=09=09=20=20"EXECUTE",=20= "USAGE",=20"ALL");=0A+=09=09else=0A+=09=09=09= COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,=0A+=09=09=09=09=09=09=09= =09=09=20"ALTER",=0A+=09=09=09=09=09=09=09=09=09=20"SELECT",=0A+=09=09=09= =09=09=09=09=09=09=20"SET",=0A+=09=09=09=09=09=09=09=09=09=20"INSERT",=0A= +=09=09=09=09=09=09=09=09=09=20"UPDATE",=0A+=09=09=09=09=09=09=09=09=09=20= "DELETE",=0A+=09=09=09=09=09=09=09=09=09=20"TRUNCATE",=0A+=09=09=09=09=09= =09=09=09=09=20"REFERENCES",=0A+=09=09=09=09=09=09=09=09=09=20"TRIGGER",=0A= +=09=09=09=09=09=09=09=09=09=20"CREATE",=0A+=09=09=09=09=09=09=09=09=09=20= "CONNECT",=0A+=09=09=09=09=09=09=09=09=09=20"TEMPORARY",=0A+=09=09=09=09=09= =09=09=09=09=20"EXECUTE",=0A+=09=09=09=09=09=09=09=09=09=20"USAGE",=0A+=09= =09=09=09=09=09=09=09=09=20"ALL");=0A+=09}=0A+=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"SET")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET"))=0A+=09=09= COMPLETE_WITH("VALUE");=0A+=09else=20if=20(TailMatches("GRANT|REVOKE",=20= "ALTER")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER"))=0A+=09=09COMPLETE_WITH("SYSTEM");=0A+=0A+=09= else=20if=20(TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE")=20||=0A+=09=09= =09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE"))=0A+=09=09COMPLETE_WITH(",",=0A+=09=09=09=09=09=20=20"ON=20= SETTING");=0A+=09else=20if=20(TailMatches("GRANT|REVOKE",=20"ALTER",=20= "SYSTEM")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM"))=0A+=09=09COMPLETE_WITH(",",=0A= +=09=09=09=09=09=20=20"ON=20SETTING");=0A+=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE,")=20||=0A+=09=09=09=20= TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20",")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE,")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"SET",=20"VALUE",=20","))=0A+=09=09= COMPLETE_WITH("ALTER=20SYSTEM=20ON=20SETTING");=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM,")=20||=0A+=09=09=09=20= TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM",=20",")=20||=0A+=09=09=09= =20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20= "SYSTEM,")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM",=20","))=0A+=09=09= COMPLETE_WITH("SET=20VALUE=20ON=20SETTING");=0A+=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE,",=20"ALTER")=20||=0A+=09=09= =09=20TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20",",=20"ALTER")=20= ||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20= "SET",=20"VALUE,",=20"ALTER")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20"SET",=20"VALUE",=20",",=20"ALTER"))=0A+=09= =09COMPLETE_WITH("SYSTEM=20ON=20SETTING");=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM,",=20"SET")=20||=0A+=09= =09=09=20TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM",=20",",=20= "SET")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20= "FOR",=20"ALTER",=20"SYSTEM,",=20"SET")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20= "SYSTEM",=20",",=20"SET"))=0A+=09=09COMPLETE_WITH("VALUE=20ON=20= SETTING");=0A+=0A+=09else=20if=20(TailMatches("GRANT|REVOKE",=20"SET",=20= "VALUE,",=20"ALTER",=20"SYSTEM")=20||=0A+=09=09=09=20= TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20",",=20"ALTER",=20= "SYSTEM")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20"ALTER",=20= "SYSTEM,",=20"SET",=20"VALUE")=20||=0A+=09=09=09=20= TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM",=20",",=20"SET",=20= "VALUE"))=0A+=09=09COMPLETE_WITH("ON=20SETTING");=0A+=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20"ON")=20||=0A+=09=09=09= =20TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM",=20"ON")=20||=0A+=09= =09=09=20TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE,",=20"ALTER",=20= "SYSTEM",=20"ON")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20= "SET",=20"VALUE",=20",",=20"ALTER",=20"SYSTEM",=20"ON")=20||=0A+=09=09=09= =20TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM,",=20"SET",=20= "VALUE",=20"ON")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20= "ALTER",=20"SYSTEM",=20",",=20"SET",=20"VALUE",=20"ON")=20||=0A+=09=09=09= =20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE",=20"ON")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM",=20"ON")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE,",=20"ALTER",=20"SYSTEM",=20"ON")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE",=20",",=20"ALTER",=20"SYSTEM",=20"ON")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20= "SYSTEM,",=20"SET",=20"VALUE",=20"ON")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20= "SYSTEM",=20",",=20"SET",=20"VALUE",=20"ON"))=0A+=09=09= COMPLETE_WITH("SETTING");=0A+=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20"ON",=20"SETTING")=20= ||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM",=20= "ON",=20"SETTING")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20= "SET",=20"VALUE,",=20"ALTER",=20"SYSTEM",=20"ON",=20"SETTING")=20||=0A+=09= =09=09=20TailMatches("GRANT|REVOKE",=20"SET",=20"VALUE",=20",",=20= "ALTER",=20"SYSTEM",=20"ON",=20"SETTING")=20||=0A+=09=09=09=20= TailMatches("GRANT|REVOKE",=20"ALTER",=20"SYSTEM,",=20"SET",=20"VALUE",=20= "ON",=20"SETTING")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20= "ALTER",=20"SYSTEM",=20",",=20"SET",=20"VALUE",=20"ON",=20"SETTING")=20= ||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20"ALL",=20"ON",=20= "SETTING")=20||=0A+=09=09=09=20TailMatches("GRANT|REVOKE",=20"ALL",=20= "PRIVILEGES",=20"ON",=20"SETTING")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE",=20"ON",=20"SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20"SYSTEM",=20"ON",=20= "SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"SET",=20"VALUE,",=20"ALTER",=20"SYSTEM",=20"ON",=20= "SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"SET",=20"VALUE",=20",",=20"ALTER",=20"SYSTEM",=20= "ON",=20"SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM,",=20"SET",=20"VALUE",=20"ON",=20= "SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM",=20",",=20"SET",=20"VALUE",=20= "ON",=20"SETTING")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALL",=20"ON",=20"SETTING")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALL",=20= "PRIVILEGES",=20"ON",=20"SETTING"))=0A+=09=09= COMPLETE_WITH_QUERY(Query_for_list_of_set_vars);=0A+=0A+=09else=20if=20= (TailMatches("GRANT",=20"SET",=20"VALUE",=20"ON",=20"SETTING",=20= MatchAny)=20||=0A+=09=09=09=20TailMatches("GRANT",=20"ALTER",=20= "SYSTEM",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("GRANT",=20"SET",=20"VALUE,",=20"ALTER",=20"SYSTEM",=20"ON",=20= "SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("GRANT",=20"SET",=20= "VALUE",=20",",=20"ALTER",=20"SYSTEM",=20"ON",=20"SETTING",=20MatchAny)=20= ||=0A+=09=09=09=20TailMatches("GRANT",=20"ALTER",=20"SYSTEM,",=20"SET",=20= "VALUE",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("GRANT",=20"ALTER",=20"SYSTEM",=20",",=20"SET",=20"VALUE",=20= "ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("GRANT",=20= "ALL",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("GRANT",=20"ALL",=20"PRIVILEGES",=20"ON",=20"SETTING",=20= MatchAny))=0A+=09=09COMPLETE_WITH("TO");=0A+=0A+=09else=20if=20= (TailMatches("REVOKE",=20"SET",=20"VALUE",=20"ON",=20"SETTING",=20= MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"ALTER",=20= "SYSTEM",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"SET",=20"VALUE,",=20"ALTER",=20"SYSTEM",=20= "ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "SET",=20"VALUE",=20",",=20"ALTER",=20"SYSTEM",=20"ON",=20"SETTING",=20= MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"ALL",=20"ON",=20= "SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "ALL",=20"PRIVILEGES",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09= =20TailMatches("REVOKE",=20"ALTER",=20"SYSTEM,",=20"SET",=20"VALUE",=20= "ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "ALTER",=20"SYSTEM",=20",",=20"SET",=20"VALUE",=20"ON",=20"SETTING",=20= MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"SET",=20"VALUE",=20"ON",=20"SETTING",=20MatchAny)=20= ||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20= "ALTER",=20"SYSTEM",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"SET",=20= "VALUE,",=20"ALTER",=20"SYSTEM",=20"ON",=20"SETTING",=20MatchAny)=20||=0A= +=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20= "SET",=20"VALUE",=20",",=20"ALTER",=20"SYSTEM",=20"ON",=20"SETTING",=20= MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20= "OPTION",=20"FOR",=20"ALTER",=20"SYSTEM,",=20"SET",=20"VALUE",=20"ON",=20= "SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20"ALTER",=20"SYSTEM",=20",",=20"SET",=20= "VALUE",=20"ON",=20"SETTING",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20"ALL",=20"ON",=20= "SETTING",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20"ALL",=20"PRIVILEGES",=20"ON",=20= "SETTING",=20MatchAny))=0A+=09=09COMPLETE_WITH("FROM");=0A=20=0A=20=09/*=0A= =20=09=20*=20Complete=20GRANT/REVOKE=20=20with=20"ON",=20= GRANT/REVOKE=20=20with=0A=20=09=20*=20TO/FROM=0A=20=09=20*/=0A-=09= else=20if=20(TailMatches("GRANT|REVOKE",=20MatchAny))=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20MatchAny))=0A=20=09= {=0A=20=09=09if=20= (TailMatches("SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREA= TE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|ALL"))=0A=20=09=09=09= COMPLETE_WITH("ON");=0A@@=20-3720,7=20+3861,8=20@@=20= psql_completion(const=20char=20*text,=20int=20start,=20int=20end)=0A=20=09= =20*=20here=20will=20only=20work=20if=20the=20privilege=20list=20= contains=20exactly=20one=0A=20=09=20*=20privilege.=0A=20=09=20*/=0A-=09= else=20if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON"))=0A+=09else=20= if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON")=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20MatchAny,=20= "ON"))=0A=20=09{=0A=20=09=09/*=0A=20=09=09=20*=20With=20ALTER=20DEFAULT=20= PRIVILEGES,=20restrict=20completion=20to=20the=20kinds=20of=0A@@=20= -3750,13=20+3892,15=20@@=20psql_completion(const=20char=20*text,=20int=20= start,=20int=20end)=0A=20=09=09=09=09=09=09=09=09=09=09=09"TABLESPACE",=0A= =20=09=09=09=09=09=09=09=09=09=09=09"TYPE");=0A=20=09}=0A-=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20"ALL"))=0A+=09else=20= if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20"ALL")=20||=0A+=09= =09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20= MatchAny,=20"ON",=20"ALL"))=0A=20=09=09COMPLETE_WITH("FUNCTIONS=20IN=20= SCHEMA",=0A=20=09=09=09=09=09=20=20"PROCEDURES=20IN=20SCHEMA",=0A=20=09=09= =09=09=09=20=20"ROUTINES=20IN=20SCHEMA",=0A=20=09=09=09=09=09=20=20= "SEQUENCES=20IN=20SCHEMA",=0A=20=09=09=09=09=09=20=20"TABLES=20IN=20= SCHEMA");=0A-=09else=20if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20= "ON",=20"FOREIGN"))=0A+=09else=20if=20(TailMatches("GRANT|REVOKE",=20= MatchAny,=20"ON",=20"FOREIGN")=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20MatchAny,=20"ON",=20"FOREIGN"))=0A=20=09=09= COMPLETE_WITH("DATA=20WRAPPER",=20"SERVER");=0A=20=0A=20=09/*=0A@@=20= -3765,7=20+3909,8=20@@=20psql_completion(const=20char=20*text,=20int=20= start,=20int=20end)=0A=20=09=20*=0A=20=09=20*=20Complete=20"GRANT/REVOKE=20= *=20ON=20*"=20with=20"TO/FROM".=0A=20=09=20*/=0A-=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20MatchAny))=0A+=09else=20= if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20MatchAny)=20||=0A= +=09=09=09=20TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20= MatchAny,=20"ON",=20MatchAny))=0A=20=09{=0A=20=09=09if=20= (TailMatches("DATABASE"))=0A=20=09=09=09= COMPLETE_WITH_QUERY(Query_for_list_of_databases);=0A@@=20-3803,6=20= +3948,25=20@@=20psql_completion(const=20char=20*text,=20int=20start,=20= int=20end)=0A=20=09=09=09=20(HeadMatches("REVOKE")=20&&=20= TailMatches("FROM")))=0A=20=09=09= COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,=0A=20=09=09=09=09=09=09= =09=09=20Keywords_for_list_of_grant_roles);=0A+=09else=20if=20= (HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny))=0A+=09=09= COMPLETE_WITH("WITH=20ADMIN=20OPTION",=0A+=09=09=09=09=09=20=20"WITH=20= GRANT=20OPTION",=0A+=09=09=09=09=09=20=20"GRANTED=20BY");=0A+=09else=20= if=20(HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny,=20= "WITH"))=0A+=09=09COMPLETE_WITH("ADMIN=20OPTION",=0A+=09=09=09=09=09=20=20= "GRANT=20OPTION");=0A+=09else=20if=20(HeadMatches("GRANT")=20&&=20= TailMatches("TO",=20MatchAny,=20"WITH",=20"ADMIN"))=0A+=09=09= COMPLETE_WITH("OPTION");=0A+=09else=20if=20((HeadMatches("GRANT")=20&&=20= TailMatches("TO",=20MatchAny,=20"WITH",=20"ADMIN",=20"OPTION"))=20||=0A+=09= =09=09=20(HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny,=20= "WITH",=20"GRANT",=20"OPTION")))=0A+=09=09COMPLETE_WITH("GRANTED=20BY");=0A= +=09else=20if=20((HeadMatches("GRANT")=20&&=20TailMatches("TO",=20= MatchAny,=20"WITH",=20"ADMIN",=20"OPTION",=20"GRANTED"))=20||=0A+=09=09=09= =20(HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny,=20"WITH",=20= "GRANT",=20"OPTION",=20"GRANTED")))=0A+=09=09COMPLETE_WITH("BY");=0A+=09= else=20if=20((HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny,=20= "WITH",=20"ADMIN",=20"OPTION",=20"GRANTED",=20"BY"))=20||=0A+=09=09=09=20= (HeadMatches("GRANT")=20&&=20TailMatches("TO",=20MatchAny,=20"WITH",=20= "GRANT",=20"OPTION",=20"GRANTED",=20"BY")))=0A+=09=09= COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,=0A+=09=09=09=09=09=09=09= =09=20Keywords_for_list_of_grant_roles);=0A=20=09/*=20Complete=20"ALTER=20= DEFAULT=20PRIVILEGES=20...=20GRANT/REVOKE=20...=20TO/FROM=20*/=0A=20=09= else=20if=20(HeadMatches("ALTER",=20"DEFAULT",=20"PRIVILEGES")=20&&=20= TailMatches("TO|FROM"))=0A=20=09=09= COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,=0A@@=20-3814,7=20= +3978,8=20@@=20psql_completion(const=20char=20*text,=20int=20start,=20= int=20end)=0A=20=09=09COMPLETE_WITH("FROM");=0A=20=0A=20=09/*=20Complete=20= "GRANT/REVOKE=20*=20ON=20ALL=20*=20IN=20SCHEMA=20*"=20with=20TO/FROM=20= */=0A-=09else=20if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20= "ALL",=20MatchAny,=20"IN",=20"SCHEMA",=20MatchAny))=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20"ALL",=20MatchAny,=20= "IN",=20"SCHEMA",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20MatchAny,=20"ON",=20"ALL",=20MatchAny,=20= "IN",=20"SCHEMA",=20MatchAny))=0A=20=09{=0A=20=09=09if=20= (TailMatches("GRANT",=20MatchAny,=20MatchAny,=20MatchAny,=20MatchAny,=20= MatchAny,=20MatchAny,=20MatchAny))=0A=20=09=09=09COMPLETE_WITH("TO");=0A= @@=20-3823,7=20+3988,8=20@@=20psql_completion(const=20char=20*text,=20= int=20start,=20int=20end)=0A=20=09}=0A=20=0A=20=09/*=20Complete=20= "GRANT/REVOKE=20*=20ON=20FOREIGN=20DATA=20WRAPPER=20*"=20with=20TO/FROM=20= */=0A-=09else=20if=20(TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20= "FOREIGN",=20"DATA",=20"WRAPPER",=20MatchAny))=0A+=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20"FOREIGN",=20"DATA",=20= "WRAPPER",=20MatchAny)=20||=0A+=09=09=09=20TailMatches("REVOKE",=20= "GRANT",=20"OPTION",=20"FOR",=20MatchAny,=20"ON",=20"FOREIGN",=20"DATA",=20= "WRAPPER",=20MatchAny))=0A=20=09{=0A=20=09=09if=20(TailMatches("GRANT",=20= MatchAny,=20MatchAny,=20MatchAny,=20MatchAny,=20MatchAny,=20MatchAny))=0A= =20=09=09=09COMPLETE_WITH("TO");=0A@@=20-3832,7=20+3998,8=20@@=20= psql_completion(const=20char=20*text,=20int=20start,=20int=20end)=0A=20=09= }=0A=20=0A=20=09/*=20Complete=20"GRANT/REVOKE=20*=20ON=20FOREIGN=20= SERVER=20*"=20with=20TO/FROM=20*/=0A-=09else=20if=20= (TailMatches("GRANT|REVOKE",=20MatchAny,=20"ON",=20"FOREIGN",=20= "SERVER",=20MatchAny))=0A+=09else=20if=20(TailMatches("GRANT|REVOKE",=20= MatchAny,=20"ON",=20"FOREIGN",=20"SERVER",=20MatchAny)=20||=0A+=09=09=09=20= TailMatches("REVOKE",=20"GRANT",=20"OPTION",=20"FOR",=20MatchAny,=20= "ON",=20"FOREIGN",=20"SERVER",=20MatchAny))=0A=20=09{=0A=20=09=09if=20= (TailMatches("GRANT",=20MatchAny,=20MatchAny,=20MatchAny,=20MatchAny,=20= MatchAny))=0A=20=09=09=09COMPLETE_WITH("TO");=0Adiff=20--git=20= a/src/include/catalog/dependency.h=20b/src/include/catalog/dependency.h=0A= index=20344482ec87..a0c3966da9=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_SETTING,=09=09=09=09/*=20= pg_setting_acl=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_default_acl.h=20= b/src/include/catalog/pg_default_acl.h=0Aindex=202a79155636..12ec9b0a31=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_SETTING=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/catalog/pg_proc.dat=20= b/src/include/catalog/pg_proc.dat=0Aindex=20d8e8715ed1..9c6cf7c558=20= 100644=0A---=20a/src/include/catalog/pg_proc.dat=0A+++=20= b/src/include/catalog/pg_proc.dat=0A@@=20-2085,6=20+2085,10=20@@=0A=20=20= =20descr=20=3D>=20'show=20hardwired=20default=20privileges,=20primarily=20= for=20use=20by=20the=20information=20schema',=0A=20=20=20proname=20=3D>=20= 'acldefault',=20prorettype=20=3D>=20'_aclitem',=20proargtypes=20=3D>=20= 'char=20oid',=0A=20=20=20prosrc=20=3D>=20'acldefault_sql'=20},=0A+{=20= oid=20=3D>=20'9806',=0A+=20=20descr=20=3D>=20'show=20hardwired=20default=20= privileges=20on=20settings',=0A+=20=20proname=20=3D>=20= 'aclsettingdefault',=20prorettype=20=3D>=20'_aclitem',=20proargtypes=20= =3D>=20'text',=0A+=20=20prosrc=20=3D>=20'aclsettingdefault_sql'=20},=0A=20= {=20oid=20=3D>=20'1689',=0A=20=20=20descr=20=3D>=20'convert=20ACL=20item=20= array=20to=20table,=20primarily=20for=20use=20by=20information=20= schema',=0A=20=20=20proname=20=3D>=20'aclexplode',=20prorows=20=3D>=20= '10',=20proretset=20=3D>=20't',=0A@@=20-7207,6=20+7211,25=20@@=0A=20=20=20= proname=20=3D>=20'has_type_privilege',=20provolatile=20=3D>=20's',=20= prorettype=20=3D>=20'bool',=0A=20=20=20proargtypes=20=3D>=20'oid=20= text',=20prosrc=20=3D>=20'has_type_privilege_id'=20},=0A=20=0A+{=20oid=20= =3D>=20'8050',=20descr=20=3D>=20'user=20privilege=20on=20setting=20by=20= username,=20setting=20name',=0A+=20=20proname=20=3D>=20= 'has_setting_privilege',=20provolatile=20=3D>=20's',=20prorettype=20=3D>=20= 'bool',=0A+=20=20proargtypes=20=3D>=20'name=20text=20text',=20prosrc=20= =3D>=20'has_setting_privilege_name_name'=20},=0A+{=20oid=20=3D>=20= '8051',=20descr=20=3D>=20'user=20privilege=20on=20setting=20by=20= username,=20setting=20oid',=0A+=20=20proname=20=3D>=20= 'has_setting_privilege',=20provolatile=20=3D>=20's',=20prorettype=20=3D>=20= 'bool',=0A+=20=20proargtypes=20=3D>=20'name=20oid=20text',=20prosrc=20=3D>= =20'has_setting_privilege_name_id'=20},=0A+{=20oid=20=3D>=20'8052',=20= descr=20=3D>=20'user=20privilege=20on=20setting=20by=20user=20oid,=20= setting=20name',=0A+=20=20proname=20=3D>=20'has_setting_privilege',=20= provolatile=20=3D>=20's',=20prorettype=20=3D>=20'bool',=0A+=20=20= proargtypes=20=3D>=20'oid=20text=20text',=20prosrc=20=3D>=20= 'has_setting_privilege_id_name'=20},=0A+{=20oid=20=3D>=20'8053',=20descr=20= =3D>=20'user=20privilege=20on=20setting=20by=20user=20oid,=20setting=20= oid',=0A+=20=20proname=20=3D>=20'has_setting_privilege',=20provolatile=20= =3D>=20's',=20prorettype=20=3D>=20'bool',=0A+=20=20proargtypes=20=3D>=20= 'oid=20oid=20text',=20prosrc=20=3D>=20'has_setting_privilege_id_id'=20},=0A= +{=20oid=20=3D>=20'8054',=20descr=20=3D>=20'current=20user=20privilege=20= on=20setting=20by=20setting=20name',=0A+=20=20proname=20=3D>=20= 'has_setting_privilege',=20provolatile=20=3D>=20's',=20prorettype=20=3D>=20= 'bool',=0A+=20=20proargtypes=20=3D>=20'text=20text',=20prosrc=20=3D>=20= 'has_setting_privilege_name'=20},=0A+{=20oid=20=3D>=20'8055',=20descr=20= =3D>=20'current=20user=20privilege=20on=20setting=20by=20setting=20oid',=0A= +=20=20proname=20=3D>=20'has_setting_privilege',=20provolatile=20=3D>=20= 's',=20prorettype=20=3D>=20'bool',=0A+=20=20proargtypes=20=3D>=20'oid=20= text',=20prosrc=20=3D>=20'has_setting_privilege_id'=20},=0A+=0A=20{=20= oid=20=3D>=20'2705',=20descr=20=3D>=20'user=20privilege=20on=20role=20by=20= username,=20role=20name',=0A=20=20=20proname=20=3D>=20'pg_has_role',=20= provolatile=20=3D>=20's',=20prorettype=20=3D>=20'bool',=0A=20=20=20= proargtypes=20=3D>=20'name=20name=20text',=20prosrc=20=3D>=20= 'pg_has_role_name_name'=20},=0Adiff=20--git=20= a/src/include/catalog/pg_setting_acl.h=20= b/src/include/catalog/pg_setting_acl.h=0Anew=20file=20mode=20100644=0A= index=200000000000..b7dee55e5c=0A---=20/dev/null=0A+++=20= b/src/include/catalog/pg_setting_acl.h=0A@@=20-0,0=20+1,63=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_setting_acl.h=0A+=20*=09=20=20definition=20of=20= the=20"configuration=20parameter"=20system=20catalog=0A+=20*=09=20=20= (pg_setting_acl).=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_setting_acl.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_SETTING_ACL_H=0A+#define=20PG_SETTING_ACL_H=0A= +=0A+#include=20"catalog/genbki.h"=0A+#include=20= "catalog/pg_setting_acl_d.h"=0A+=0A+/*=20----------------=0A+=20*=09=09= pg_setting_acl=20definition.=20=20cpp=20turns=20this=20into=0A+=20*=09=09= typedef=20struct=20FormData_pg_setting_acl=0A+=20*=20----------------=0A= +=20*/=0A+CATALOG(pg_setting_acl,8924,SettingAclRelationId)=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*=20setting.=0A+=09=20*/=0A+=09= text=09=09setting=20BKI_FORCE_NOT_NULL;=0A+=0A+#ifdef=20CATALOG_VARLEN=0A= +=09/*=20Access=20privileges=20*/=0A+=09aclitem=09=09setacl[1]=20= BKI_DEFAULT(_null_);=0A+#endif=0A+}=20FormData_pg_setting_acl;=0A+=0A+=0A= +/*=20----------------=0A+=20*=09=09Form_pg_setting_acl=20corresponds=20= to=20a=20pointer=20to=20a=20tuple=20with=0A+=20*=09=09the=20format=20of=20= pg_setting_acl=20relation.=0A+=20*=20----------------=0A+=20*/=0A= +typedef=20FormData_pg_setting_acl=20*Form_pg_setting_acl;=0A+=0A= +DECLARE_TOAST(pg_setting_acl,=208925,=208926);=0A+#define=20= PgSettingAclToastTable=208925=0A+#define=20PgSettingAclToastIndex=208926=0A= +=0A+DECLARE_UNIQUE_INDEX(pg_setting_acl_setting_index,=208927,=20= SettingAclSettingIndexId,=20on=20pg_setting_acl=20using=20btree(setting=20= text_ops));=0A+DECLARE_UNIQUE_INDEX_PKEY(pg_setting_acl_oid_index,=20= 8928,=20SettingAclOidIndexId,=20on=20pg_setting_acl=20using=20btree(oid=20= oid_ops));=0A+=0A+extern=20Oid=09SettingAclCreate(const=20char=20= *setting,=20bool=20if_not_exists);=0A+=0A+#endif=09=09=09=09=09=09=09/*=20= PG_SETTING_ACL_H=20*/=0Adiff=20--git=20a/src/include/nodes/parsenodes.h=20= b/src/include/nodes/parsenodes.h=0Aindex=201617702d9d..5f5e4ae8e1=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=20= ALTER=20SYSTEM=20ON=20SETTING=20full_page_writes=20TO=20= regress_dump_test_role'=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= SETTING=20full_page_writes=20TO=20regress_dump_test_role;',=0A+=09=09= regexp=20=20=20=20=20=20=20=3D>=0A+=0A+=09=09=09qr/^GRANT=20ALTER=20= SYSTEM=20ON=20SETTING=20full_page_writes=20TO=20= regress_dump_test_role;/m,=0A+=09=09like=20=20=20=20=20=20=20=20=20=3D>=20= {=20pg_dumpall_globals=20=3D>=201,=20},=0A+=09},=0A+=0A+=09'GRANT=20ALL=20= ON=20SETTING=20fsync=20TO=20regress_dump_test_role=20WITH=20GRANT=20= OPTION'=20=3D>=20{=0A+=09=09create_order=20=3D>=202,=0A+=09=09create_sql=20= =3D>=0A+=09=09=09'GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20SETTING=20= fsync=20TO=20regress_dump_test_role=20WITH=20GRANT=20OPTION;',=0A+=09=09= regexp=20=3D>=0A+=09=09=09#=20"set=20value"=20plus=20"alter=20system"=20= is=20"all"=20privileges=20on=20settings=0A+=09=09=09qr/^GRANT=20ALL=20ON=20= SETTING=20fsync=20TO=20regress_dump_test_role=20WITH=20GRANT=20= OPTION;/m,=0A+=09=09like=20=3D>=20{=20pg_dumpall_globals=20=3D>=201,=20= },=0A+=09},=0A+=0A+=09'GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= zero_damaged_pages"=20TO=20regress_dump_test_role'=20=3D>=20{=0A+=09=09= create_order=20=3D>=202,=0A+=09=09create_sql=20=3D>=0A+=09=09=09#=20= configuration=20parameters=20get=20cased=20folded=0A+=09=09=09'GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20ZERO_DAMAGED_PAGES=20TO=20= regress_dump_test_role;',=0A+=09=09regexp=20=3D>=0A+=09=09=09qr/^GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20zero_damaged_pages=20TO=20= regress_dump_test_role;/m,=0A+=09=09like=20=3D>=20{=20pg_dumpall_globals=20= =3D>=201,=20},=0A+=09},=0A+=0A+=09'GRANT=20ALL=20ON=20SETTING=20= ignore_checksum_failure=20TO=20regress_dump_test_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=20SETTING=20ignore_checksum_failure=20TO=20regress_dump_test_role=20= GRANTED=20BY=20CURRENT_ROLE;',=0A+=09=09regexp=20=3D>=0A+=09=09=09= qr/^GRANT=20ALL=20ON=20SETTING=20ignore_checksum_failure=20TO=20= regress_dump_test_role/m,=0A+=09=09like=20=3D>=20{=20pg_dumpall_globals=20= =3D>=201,=20},=0A+=09},=0A+=0A+=09'REVOKE=20SET=20VALUE=20ON=20SETTING=20= work_mem=20FROM=20PUBLIC'=20=3D>=20{=0A+=09=09create_order=20=3D>=202,=0A= +=09=09create_sql=20=3D>=0A+=09=09=09'REVOKE=20ALL=20PRIVILEGES=20ON=20= SETTING=20work_mem=20FROM=20PUBLIC;',=0A+=09=09regexp=20=3D>=0A+=09=09=09= #=20Pubilc=20only=20has=20"set=20value"=20by=20default,=20so=20revoking=20= "all=20privileges"=20is=20simplified=20to=20revoking=20"set=20value"=0A+=09= =09=09qr/^REVOKE=20SET=20VALUE=20ON=20SETTING=20work_mem=20FROM=20= PUBLIC;/m,=0A+=09=09like=20=3D>=20{=20pg_dumpall_globals=20=3D>=201,=20= },=0A+=09},=0A+=0A+=09'GRANT=20ALL=20ON=20SETTING=20"DateStyle"=20TO=20= regress_dump_test_role'=20=3D>=20{=0A+=09=09create_order=20=3D>=202,=0A+=09= =09create_sql=20=3D>=0A+=09=09=09'GRANT=20ALL=20ON=20SETTING=20DateStyle=20= TO=20regress_dump_test_role=20WITH=20GRANT=20OPTION;=20REVOKE=20GRANT=20= OPTION=20FOR=20ALL=20ON=20SETTING=20DateStyle=20FROM=20= regress_dump_test_role;',=0A+=09=09regexp=20=3D>=0A+=09=09=09#=20The=20= revoke=20simplifies=20the=20ultimate=20grant=20so=20as=20to=20not=20= include=20"with=20grant=20option"=0A+=09=09=09qr/^GRANT=20ALL=20ON=20= SETTING=20"DateStyle"=20TO=20regress_dump_test_role;/m,=0A+=09=09like=20= =3D>=20{=20pg_dumpall_globals=20=3D>=201,=20},=0A+=09},=0A+=0A=20=09= 'CREATE=20SCHEMA=20public'=20=3D>=20{=0A=20=09=09regexp=20=3D>=20= qr/^CREATE=20SCHEMA=20public;/m,=0A=20=09=09like=20=20=20=3D>=20{=0A@@=20= -791,6=20+851,7=20@@=20foreach=20my=20$run=20(sort=20keys=20= %pgdump_runs)=0A=20=09=09=09if=20(!ok($output_file=20=3D~=20= $tests{$test}->{regexp},=0A=20=09=09=09=09=09"$run:=20should=20dump=20= $test"))=0A=20=09=09=09{=0A+=09=09=09=09die=20= "\n\n--\n\n$output_file\n\n--\n\n";=0A=20=09=09=09=09diag("Review=20$run=20= results=20in=20$tempdir");=0A=20=09=09=09}=0A=20=09=09}=0Adiff=20--git=20= a/src/test/regress/expected/guc_privs.out=20= b/src/test/regress/expected/guc_privs.out=0Anew=20file=20mode=20100644=0A= index=200000000000..3d99cc028c=0A---=20/dev/null=0A+++=20= b/src/test/regress/expected/guc_privs.out=0A@@=20-0,0=20+1,367=20@@=0A= +--=20Test=20superuser=0A+--=20Superuser=20DBA=0A+CREATE=20ROLE=20= regress_admin=20SUPERUSER;=0A+--=20Perform=20operations=20as=20user=20= 'regress_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20regress_admin;=0A= +--=20PGC_BACKEND=0A+SET=20ignore_system_indexes=20=3D=20OFF;=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+RESET=20ignore_system_indexes;=20=20--=20fail,=20= cannot=20be=20set=20after=20connection=20start=0A+ERROR:=20=20parameter=20= "ignore_system_indexes"=20cannot=20be=20set=20after=20connection=20start=0A= +ALTER=20SYSTEM=20SET=20ignore_system_indexes=20=3D=20OFF;=20=20--=20ok=0A= +ALTER=20SYSTEM=20RESET=20ignore_system_indexes;=20=20--=20ok=0A+--=20= PGC_INTERNAL=0A+SET=20block_size=20=3D=2050;=20=20--=20fail,=20cannot=20= be=20changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20be=20= changed=0A+RESET=20block_size;=20=20--=20fail,=20cannot=20be=20changed=0A= +ERROR:=20=20parameter=20"block_size"=20cannot=20be=20changed=0A+ALTER=20= SYSTEM=20SET=20block_size=20=3D=2050;=20=20--=20fail,=20cannot=20be=20= changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20be=20changed=0A= +ALTER=20SYSTEM=20RESET=20block_size;=20=20--=20fail,=20cannot=20be=20= changed=0A+ERROR:=20=20parameter=20"block_size"=20cannot=20be=20changed=0A= +--=20PGC_POSTMASTER=0A+SET=20autovacuum_freeze_max_age=20=3D=20= 1000050000;=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= 'C';=20=20--=20ok=0A+RESET=20lc_messages;=20=20--=20ok=0A+ALTER=20SYSTEM=20= SET=20lc_messages=20=3D=20'C';=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+ERROR:=20=20parameter=20= "jit_debugging_support"=20cannot=20be=20set=20after=20connection=20start=0A= +RESET=20jit_debugging_support;=20=20--=20fail,=20cannot=20be=20set=20= after=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+--=20Create=20non-superuser=20with=20privileges=20= to=20configure=20host=20resource=20usage=0A+CREATE=20ROLE=20= regress_host_resource_admin=20NOSUPERUSER;=0A+--=20Check=20the=20new=20= role=20does=20not=20yet=20have=20privileges=20on=20settings=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE,=20ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+--=20Check=20= inappropriate=20and=20nonsense=20privilege=20types=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SELECT,=20UPDATE,=20CREATE');=0A+ERROR:=20=20unrecognized=20privilege=20= type:=20"SELECT"=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'USAGE');=0A+ERROR:=20=20unrecognized=20privilege=20type:=20"USAGE"=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'WHATEVER');=0A+ERROR:=20=20unrecognized=20privilege=20= type:=20"WHATEVER"=0A+--=20Revoke,=20grant,=20and=20revoke=20again=20a=20= SUSET=20setting=20not=20yet=20granted=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20= =0A+-----------------------=0A+=20=0A+(1=20row)=0A+=0A+REVOKE=20SET=20= VALUE=20ON=20SETTING=20zero_damaged_pages=20FROM=20= regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20= =0A+-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+GRANT=20SET=20= VALUE=20ON=20SETTING=20zero_damaged_pages=20TO=20= regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20= =0A+-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+REVOKE=20SET=20= VALUE=20ON=20SETTING=20zero_damaged_pages=20FROM=20= regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20= =0A+-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+--=20Revoke,=20= grant,=20and=20revoke=20again=20a=20USERSET=20setting=20not=20yet=20= granted=0A+SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+REVOKE=20SET=20= VALUE=20ON=20SETTING=20work_mem=20FROM=20regress_host_resource_admin;=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+GRANT=20SET=20VALUE=20= ON=20SETTING=20work_mem=20TO=20regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+REVOKE=20SET=20= VALUE=20ON=20SETTING=20work_mem=20FROM=20regress_host_resource_admin;=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20f=0A+(1=20row)=0A+=0A+--=20Grant=20= privileges=20on=20settings=20to=20the=20new=20non-superuser=20role=0A= +GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20SETTING=0A+=09= autovacuum_work_mem,=20hash_mem_multiplier,=20logical_decoding_work_mem,=0A= +=09maintenance_work_mem,=20max_stack_depth,=20= min_dynamic_shared_memory,=0A+=09shared_buffers,=20temp_buffers,=20= temp_file_limit,=20work_mem=0A+TO=20regress_host_resource_admin;=0A+--=20= Check=20the=20new=20role=20now=20has=20privilges=20on=20settings=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE,=20ALTER=20SYSTEM');=0A+=20= has_setting_privilege=20=0A+-----------------------=0A+=20t=0A+(1=20row)=0A= +=0A+SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+=20has_setting_privilege=20=0A= +-----------------------=0A+=20t=0A+(1=20row)=0A+=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE=20WITH=20GRANT=20OPTION,=20ALTER=20SYSTEM=20WITH=20GRANT=20= OPTION');=0A+=20has_setting_privilege=20=0A+-----------------------=0A+=20= f=0A+(1=20row)=0A+=0A+--=20Check=20again=20the=20inappropriate=20and=20= nonsense=20privilege=20types.=20=20The=20prior=20similar=20check=0A+--=20= was=20performed=20before=20any=20entry=20for=20work_mem=20existed.=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SELECT,=20UPDATE,=20CREATE');=0A+ERROR:=20=20unrecognized=20= privilege=20type:=20"SELECT"=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'USAGE');=0A+ERROR:=20=20unrecognized=20privilege=20type:=20"USAGE"=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'WHATEVER');=0A+ERROR:=20=20unrecognized=20privilege=20= type:=20"WHATEVER"=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'WHATEVER=20WITH=20GRANT=20OPTION');=0A+ERROR:=20=20unrecognized=20= privilege=20type:=20"WHATEVER=20WITH=20GRANT=20OPTION"=0A+--=20Check=20= other=20function=20signatures=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=0A+=09=09=09=09=09=09= =09=20(SELECT=20oid=20FROM=20pg_catalog.pg_setting_acl=20WHERE=20setting=20= =3D=20'max_stack_depth'),=0A+=09=09=09=09=09=09=09=20'SET=20VALUE');=0A+=20= has_setting_privilege=20=0A+-----------------------=0A+=20t=0A+(1=20row)=0A= +=0A+SELECT=20has_setting_privilege((SELECT=20oid=20FROM=20= pg_catalog.pg_authid=20WHERE=20rolname=20=3D=20= 'regress_host_resource_admin'),=0A+=09=09=09=09=09=09=09=20= 'max_stack_depth',=0A+=09=09=09=09=09=09=09=20'SET=20VALUE');=0A+=20= has_setting_privilege=20=0A+-----------------------=0A+=20t=0A+(1=20row)=0A= +=0A+SELECT=20has_setting_privilege((SELECT=20oid=20FROM=20= pg_catalog.pg_authid=20WHERE=20rolname=20=3D=20= 'regress_host_resource_admin'),=0A+=09=09=09=09=09=09=09=20(SELECT=20oid=20= FROM=20pg_catalog.pg_setting_acl=20WHERE=20setting=20=3D=20= 'max_stack_depth'),=0A+=09=09=09=09=09=09=09=20'SET=20VALUE');=0A+=20= has_setting_privilege=20=0A+-----------------------=0A+=20t=0A+(1=20row)=0A= +=0A+SELECT=20has_setting_privilege('hash_mem_multiplier',=20'set=20= value');=0A+=20has_setting_privilege=20=0A+-----------------------=0A+=20= t=0A+(1=20row)=0A+=0A+SELECT=20has_setting_privilege((SELECT=20oid=20= FROM=20pg_catalog.pg_setting_acl=20WHERE=20setting=20=3D=20'work_mem'),=0A= +=09=09=09=09=09=09=09=20'alter=20system=20with=20grant=20option');=0A+=20= has_setting_privilege=20=0A+-----------------------=0A+=20t=0A+(1=20row)=0A= +=0A+--=20Perform=20all=20operations=20as=20user=20= 'regress_host_resource_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_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+SET=20SESSION=20= AUTHORIZATION=20regress_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=20setting=20work_mem=0A+privileges=20for=20setting=20= maintenance_work_mem=0A+privileges=20for=20setting=20autovacuum_work_mem=0A= +privileges=20for=20setting=20hash_mem_multiplier=0A+privileges=20for=20= setting=20logical_decoding_work_mem=0A+privileges=20for=20setting=20= max_stack_depth=0A+privileges=20for=20setting=20= min_dynamic_shared_memory=0A+privileges=20for=20setting=20shared_buffers=0A= +privileges=20for=20setting=20temp_buffers=0A+privileges=20for=20setting=20= temp_file_limit=0A+--=20Use=20"revoke"=20to=20remove=20the=20privileges=20= and=20allow=20the=20role=20to=20be=20dropped=0A+REVOKE=20SET=20VALUE,=20= ALTER=20SYSTEM=20ON=20SETTING=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+SET=20SESSION=20AUTHORIZATION=20regress_admin;=0A= +GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20SETTING=0A+=09= autovacuum_work_mem,=20hash_mem_multiplier,=20logical_decoding_work_mem,=0A= +=09maintenance_work_mem,=20max_stack_depth,=20= min_dynamic_shared_memory,=0A+=09shared_buffers,=20temp_buffers,=20= temp_file_limit,=20work_mem=0A+TO=20regress_host_resource_admin;=0A+DROP=20= ROLE=20regress_host_resource_admin;=20=20--=20fail,=20privileges=20= remain=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=20setting=20work_mem=0A+privileges=20for=20setting=20= maintenance_work_mem=0A+privileges=20for=20setting=20autovacuum_work_mem=0A= +privileges=20for=20setting=20hash_mem_multiplier=0A+privileges=20for=20= setting=20logical_decoding_work_mem=0A+privileges=20for=20setting=20= max_stack_depth=0A+privileges=20for=20setting=20= min_dynamic_shared_memory=0A+privileges=20for=20setting=20shared_buffers=0A= +privileges=20for=20setting=20temp_buffers=0A+privileges=20for=20setting=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+SET=20SESSION=20AUTHORIZATION=20= regress_admin;=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20= ok=0A+--=20Try=20that=20again,=20but=20use=20"reassign=20owned=20by"=20= this=20time=0A+CREATE=20ROLE=20regress_host_resource_admin=20= NOSUPERUSER;=0A+CREATE=20ROLE=20regress_host_resource_newadmin=20= NOSUPERUSER;=0A+GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20SETTING=0A+=09= autovacuum_work_mem,=20hash_mem_multiplier,=20logical_decoding_work_mem,=0A= +=09maintenance_work_mem,=20max_stack_depth,=20= min_dynamic_shared_memory,=0A+=09shared_buffers,=20temp_buffers,=20= temp_file_limit,=20work_mem=0A+TO=20regress_host_resource_admin;=0A= +REASSIGN=20OWNED=20BY=20regress_host_resource_admin=20TO=20= regress_host_resource_newadmin;=0A+SET=20SESSION=20AUTHORIZATION=20= regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20"reassign=20owned"=20did=20= not=20change=20privileges=0A+SET=20SESSION=20AUTHORIZATION=20= regress_admin;=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=20setting=20= work_mem=0A+privileges=20for=20setting=20maintenance_work_mem=0A= +privileges=20for=20setting=20autovacuum_work_mem=0A+privileges=20for=20= setting=20hash_mem_multiplier=0A+privileges=20for=20setting=20= logical_decoding_work_mem=0A+privileges=20for=20setting=20= max_stack_depth=0A+privileges=20for=20setting=20= min_dynamic_shared_memory=0A+privileges=20for=20setting=20shared_buffers=0A= +privileges=20for=20setting=20temp_buffers=0A+privileges=20for=20setting=20= temp_file_limit=0A+DROP=20ROLE=20regress_host_resource_newadmin;=20=20--=20= ok,=20nothing=20was=20transferred=0A+--=20Use=20"drop=20owned=20by"=20so=20= we=20can=20drop=20the=20role=0A+DROP=20OWNED=20BY=20= regress_host_resource_admin;=20=20--=20ok=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20ok=0Adiff=20--git=20= a/src/test/regress/expected/privileges.out=20= b/src/test/regress/expected/privileges.out=0Aindex=20= 291e21d7a6..3158903bda=20100644=0A---=20= a/src/test/regress/expected/privileges.out=0A+++=20= b/src/test/regress/expected/privileges.out=0A@@=20-54,6=20+54,36=20@@=20= REVOKE=20pg_read_all_settings=20FROM=20regress_priv_user8;=0A=20DROP=20= USER=20regress_priv_user10;=0A=20DROP=20USER=20regress_priv_user9;=0A=20= DROP=20USER=20regress_priv_user8;=0A+GRANT=20SET=20VALUE=20ON=20SETTING=20= enable_memoize=20TO=20regress_priv_user6;=0A+GRANT=20SET=20VALUE=20ON=20= SETTING=20enable_nestloop=20TO=20regress_priv_user6;=0A+SET=20ROLE=20= regress_priv_user6;=0A+SET=20enable_memoize=20TO=20false;=0A+SET=20= enable_nestloop=20TO=20false;=0A+RESET=20enable_memoize;=0A+RESET=20= enable_nestloop;=0A+RESET=20ROLE;=0A+GRANT=20ALTER=20SYSTEM=20ON=20= SETTING=20enable_seqscan=20TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20sort_mem=20TO=20regress_priv_user7;=20--=20= old=20name=20for=20"work_mem"=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= maintenance_work_mem=20TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20no_such_param=20TO=20regress_priv_user7;=20= --=20ok=0A+ERROR:=20=20unrecognized=20configuration=20parameter=20= "no_such_param"=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= no_such_extension.no_such_param=20TO=20regress_priv_user7;=20--=20ok=0A= +ERROR:=20=20unrecognized=20configuration=20parameter=20= "no_such_extension.no_such_param"=0A+GRANT=20ALTER=20SYSTEM=20ON=20= SETTING=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20TO=20= regress_priv_user7;=20--=20ok=0A+ERROR:=20=20unrecognized=20= configuration=20parameter=20= "no_such_extension.no_such_param.longer.than.maximum.namedata.length"=0A= +GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20""=20TO=20regress_priv_user7;=20= --=20bad=20name=0A+ERROR:=20=20zero-length=20delimited=20identifier=20at=20= or=20near=20""""=0A+LINE=201:=20GRANT=20ALTER=20SYSTEM=20ON=20SETTING=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=20=20=20=20=20=20=20=20= ^=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20"=20"=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+ERROR:=20=20invalid=20setting=20= name=20"=20"=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20"=20foo=20"=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+ERROR:=20=20invalid=20setting=20= name=20"=20foo=20"=0A+GRANT=20SELECT=20ON=20public.persons2=20TO=20= regress_priv_user7;=0A+SET=20ROLE=20regress_priv_user7;=0A+ALTER=20= SYSTEM=20SET=20enable_seqscan=20=3D=20OFF;=0A+ALTER=20SYSTEM=20RESET=20= enable_seqscan;=0A+RESET=20ROLE;=0A=20CREATE=20GROUP=20= regress_priv_group1;=0A=20CREATE=20GROUP=20regress_priv_group2=20WITH=20= USER=20regress_priv_user1,=20regress_priv_user2;=0A=20ALTER=20GROUP=20= regress_priv_group1=20ADD=20USER=20regress_priv_user4;=0A@@=20-2355,10=20= +2385,32=20@@=20DROP=20USER=20regress_priv_user2;=0A=20DROP=20USER=20= regress_priv_user3;=0A=20DROP=20USER=20regress_priv_user4;=0A=20DROP=20= USER=20regress_priv_user5;=0A-DROP=20USER=20regress_priv_user6;=0A-DROP=20= USER=20regress_priv_user7;=0A+DROP=20USER=20regress_priv_user6;=20--=20= privileges=20remain=0A+ERROR:=20=20role=20"regress_priv_user6"=20cannot=20= be=20dropped=20because=20some=20objects=20depend=20on=20it=0A+DETAIL:=20=20= privileges=20for=20setting=20enable_memoize=0A+privileges=20for=20= setting=20enable_nestloop=0A+DROP=20USER=20regress_priv_user7;=20--=20= privileges=20remain=0A+ERROR:=20=20role=20"regress_priv_user7"=20cannot=20= be=20dropped=20because=20some=20objects=20depend=20on=20it=0A+DETAIL:=20=20= privileges=20for=20table=20persons2=0A+privileges=20for=20setting=20= enable_seqscan=0A+privileges=20for=20setting=20work_mem=0A+privileges=20= for=20setting=20maintenance_work_mem=0A=20DROP=20USER=20= regress_priv_user8;=20--=20does=20not=20exist=0A=20ERROR:=20=20role=20= "regress_priv_user8"=20does=20not=20exist=0A+REVOKE=20SELECT=20ON=20= public.persons2=20FROM=20regress_priv_user7;=0A+REVOKE=20ALTER=20SYSTEM=20= ON=20SETTING=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20ok=0A= +REVOKE=20ALTER=20SYSTEM=20ON=20SETTING=20work_mem=20FROM=20= regress_priv_user7;=20--=20ok,=20use=20new=20name=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20SETTING=20vacuum_mem=20FROM=20regress_priv_user7;=20--=20= ok,=20use=20old=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20SETTING=20= no_such_param=20FROM=20regress_priv_user7;=20--=20ok=0A+ERROR:=20=20= unrecognized=20configuration=20parameter=20"no_such_param"=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20SETTING=20no_such_extension.no_such_param=20FROM=20= regress_priv_user7;=20--=20ok=0A+ERROR:=20=20unrecognized=20= configuration=20parameter=20"no_such_extension.no_such_param"=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20SETTING=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20= FROM=20regress_priv_user7;=20--=20ok=0A+ERROR:=20=20unrecognized=20= configuration=20parameter=20= "no_such_extension.no_such_param.longer.than.maximum.namedata.length"=0A= +DROP=20USER=20regress_priv_user7;=20--=20ok=0A+REVOKE=20SET=20VALUE=20= ON=20SETTING=20enable_memoize=20FROM=20regress_priv_user6;=0A+REVOKE=20= SET=20VALUE=20ON=20SETTING=20enable_nestloop=20FROM=20= regress_priv_user6;=0A+DROP=20USER=20regress_priv_user6;=20--=20ok=0A=20= --=20permissions=20with=20LOCK=20TABLE=0A=20CREATE=20USER=20= regress_locktable_user;=0A=20CREATE=20TABLE=20lock_table=20(a=20int);=0A= diff=20--git=20a/src/test/regress/expected/rules.out=20= b/src/test/regress/expected/rules.out=0Aindex=20ac468568a1..0d0e3ff410=20= 100644=0A---=20a/src/test/regress/expected/rules.out=0A+++=20= b/src/test/regress/expected/rules.out=0A@@=20-1686,6=20+1686,19=20@@=20= pg_sequences|=20SELECT=20n.nspname=20AS=20schemaname,=0A=20=20=20=20=20=20= JOIN=20pg_class=20c=20ON=20((c.oid=20=3D=20s.seqrelid)))=0A=20=20=20=20=20= =20LEFT=20JOIN=20pg_namespace=20n=20ON=20((n.oid=20=3D=20= c.relnamespace)))=0A=20=20=20WHERE=20((NOT=20= pg_is_other_temp_schema(n.oid))=20AND=20(c.relkind=20=3D=20= 'S'::"char"));=0A+pg_setting_privileges|=20SELECT=20grantor.rolname=20AS=20= grantor,=0A+=20=20=20=20grantee.rolname=20AS=20grantee,=0A+=20=20=20=20= set_acl.setting,=0A+=20=20=20=20acl.privilege_type,=0A+=20=20=20=20= acl.is_grantable=0A+=20=20=20FROM=20pg_setting_acl=20set_acl,=0A+=20=20=20= =20((LATERAL=20(=20SELECT=20aclexplode.grantor,=0A+=20=20=20=20=20=20=20=20= =20=20=20=20aclexplode.grantee,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= aclexplode.privilege_type,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= aclexplode.is_grantable=0A+=20=20=20=20=20=20=20=20=20=20=20FROM=20= aclexplode(set_acl.setacl)=20aclexplode(grantor,=20grantee,=20= privilege_type,=20is_grantable))=20acl=0A+=20=20=20=20=20LEFT=20JOIN=20= pg_authid=20grantee=20ON=20((acl.grantee=20=3D=20grantee.oid)))=0A+=20=20= =20=20=20LEFT=20JOIN=20pg_authid=20grantor=20ON=20((acl.grantor=20=3D=20= grantor.oid)));=0A=20pg_settings|=20SELECT=20a.name,=0A=20=20=20=20=20= a.setting,=0A=20=20=20=20=20a.unit,=0Adiff=20--git=20= a/src/test/regress/parallel_schedule=20= b/src/test/regress/parallel_schedule=0Aindex=206d8f524ae9..4dfa0642c0=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#=20psql=20depends=20on=20create_am=0A=20#=20= amutils=20depends=20on=20geometry,=20create_index_spgist,=20hash_index,=20= brin=0A=20#=20----------=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=20create_role=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=20create_role=20guc_privs=0A=20=0A=20#=20collate.*.utf8=20= tests=20cannot=20be=20run=20in=20parallel=20with=20each=20other=0A=20= test:=20rules=20psql=20psql_crosstab=20amutils=20stats_ext=20= collate.linux.utf8=0Adiff=20--git=20a/src/test/regress/sql/guc_privs.sql=20= b/src/test/regress/sql/guc_privs.sql=0Anew=20file=20mode=20100644=0A= index=200000000000..5914ae69de=0A---=20/dev/null=0A+++=20= b/src/test/regress/sql/guc_privs.sql=0A@@=20-0,0=20+1,165=20@@=0A+--=20= Test=20superuser=0A+--=20Superuser=20DBA=0A+CREATE=20ROLE=20= regress_admin=20SUPERUSER;=0A+--=20Perform=20operations=20as=20user=20= 'regress_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20regress_admin;=0A= +--=20PGC_BACKEND=0A+SET=20ignore_system_indexes=20=3D=20OFF;=20=20--=20= fail,=20cannot=20be=20set=20after=20connection=20start=0A+RESET=20= ignore_system_indexes;=20=20--=20fail,=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+RESET=20block_size;=20=20--=20fail,=20= cannot=20be=20changed=0A+ALTER=20SYSTEM=20SET=20block_size=20=3D=2050;=20= =20--=20fail,=20cannot=20be=20changed=0A+ALTER=20SYSTEM=20RESET=20= block_size;=20=20--=20fail,=20cannot=20be=20changed=0A+--=20= PGC_POSTMASTER=0A+SET=20autovacuum_freeze_max_age=20=3D=201000050000;=20=20= --=20fail,=20requires=20restart=0A+RESET=20autovacuum_freeze_max_age;=20=20= --=20fail,=20requires=20restart=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+ALTER=20SYSTEM=20RESET=20= config_file;=20=20--=20fail,=20cannot=20be=20changed=0A+--=20PGC_SIGHUP=0A= +SET=20autovacuum=20=3D=20OFF;=20=20--=20fail,=20requires=20reload=0A= +RESET=20autovacuum;=20=20--=20fail,=20requires=20reload=0A+ALTER=20= SYSTEM=20SET=20autovacuum=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20autovacuum;=20=20--=20ok=0A+--=20PGC_SUSET=0A+SET=20lc_messages=20= =3D=20'C';=20=20--=20ok=0A+RESET=20lc_messages;=20=20--=20ok=0A+ALTER=20= SYSTEM=20SET=20lc_messages=20=3D=20'C';=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20lc_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+--=20= Create=20non-superuser=20with=20privileges=20to=20configure=20host=20= resource=20usage=0A+CREATE=20ROLE=20regress_host_resource_admin=20= NOSUPERUSER;=0A+--=20Check=20the=20new=20role=20does=20not=20yet=20have=20= privileges=20on=20settings=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE,=20ALTER=20SYSTEM');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+--=20Check=20inappropriate=20and=20nonsense=20= privilege=20types=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SELECT,=20UPDATE,=20CREATE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'USAGE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'WHATEVER');=0A+--=20Revoke,=20grant,=20and=20revoke=20again=20a=20SUSET=20= setting=20not=20yet=20granted=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+REVOKE=20SET=20VALUE=20ON=20= SETTING=20zero_damaged_pages=20FROM=20regress_host_resource_admin;=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+GRANT=20SET=20VALUE=20ON=20= SETTING=20zero_damaged_pages=20TO=20regress_host_resource_admin;=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+REVOKE=20SET=20VALUE=20ON=20= SETTING=20zero_damaged_pages=20FROM=20regress_host_resource_admin;=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20= 'zero_damaged_pages',=20'ALTER=20SYSTEM');=0A+--=20Revoke,=20grant,=20= and=20revoke=20again=20a=20USERSET=20setting=20not=20yet=20granted=0A= +SELECT=20has_setting_privilege('regress_host_resource_admin',=20= 'work_mem',=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+REVOKE=20SET=20VALUE=20ON=20SETTING=20work_mem=20= FROM=20regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+GRANT=20SET=20VALUE=20ON=20SETTING=20work_mem=20TO=20= regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+REVOKE=20SET=20VALUE=20ON=20SETTING=20work_mem=20= FROM=20regress_host_resource_admin;=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+--=20Grant=20privileges=20on=20settings=20to=20the=20= new=20non-superuser=20role=0A+GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20= SETTING=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+--=20Check=20the=20new=20role=20now=20= has=20privilges=20on=20settings=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE,=20ALTER=20SYSTEM');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'ALTER=20SYSTEM');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SET=20VALUE=20WITH=20GRANT=20OPTION,=20ALTER=20SYSTEM=20WITH=20GRANT=20= OPTION');=0A+--=20Check=20again=20the=20inappropriate=20and=20nonsense=20= privilege=20types.=20=20The=20prior=20similar=20check=0A+--=20was=20= performed=20before=20any=20entry=20for=20work_mem=20existed.=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'SELECT,=20UPDATE,=20CREATE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'USAGE');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'WHATEVER');=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=20'work_mem',=20= 'WHATEVER=20WITH=20GRANT=20OPTION');=0A+--=20Check=20other=20function=20= signatures=0A+SELECT=20= has_setting_privilege('regress_host_resource_admin',=0A+=09=09=09=09=09=09= =09=20(SELECT=20oid=20FROM=20pg_catalog.pg_setting_acl=20WHERE=20setting=20= =3D=20'max_stack_depth'),=0A+=09=09=09=09=09=09=09=20'SET=20VALUE');=0A= +SELECT=20has_setting_privilege((SELECT=20oid=20FROM=20= pg_catalog.pg_authid=20WHERE=20rolname=20=3D=20= 'regress_host_resource_admin'),=0A+=09=09=09=09=09=09=09=20= 'max_stack_depth',=0A+=09=09=09=09=09=09=09=20'SET=20VALUE');=0A+SELECT=20= has_setting_privilege((SELECT=20oid=20FROM=20pg_catalog.pg_authid=20= WHERE=20rolname=20=3D=20'regress_host_resource_admin'),=0A+=09=09=09=09=09= =09=09=20(SELECT=20oid=20FROM=20pg_catalog.pg_setting_acl=20WHERE=20= setting=20=3D=20'max_stack_depth'),=0A+=09=09=09=09=09=09=09=20'SET=20= VALUE');=0A+SELECT=20has_setting_privilege('hash_mem_multiplier',=20'set=20= value');=0A+SELECT=20has_setting_privilege((SELECT=20oid=20FROM=20= pg_catalog.pg_setting_acl=20WHERE=20setting=20=3D=20'work_mem'),=0A+=09=09= =09=09=09=09=09=20'alter=20system=20with=20grant=20option');=0A+--=20= Perform=20all=20operations=20as=20user=20'regress_host_resource_admin'=20= --=0A+SET=20SESSION=20AUTHORIZATION=20regress_host_resource_admin;=0A= +ALTER=20SYSTEM=20SET=20autovacuum_work_mem=20=3D=2032;=20=20--=20ok,=20= privileges=20have=20been=20granted=0A+ALTER=20SYSTEM=20SET=20= ignore_system_indexes=20=3D=20OFF;=20=20--=20fail,=20insufficient=20= privileges=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+SET=20SESSION=20= AUTHORIZATION=20regress_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20fail,=20privileges=20remain=0A+--=20= Use=20"revoke"=20to=20remove=20the=20privileges=20and=20allow=20the=20= role=20to=20be=20dropped=0A+REVOKE=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=20= SETTING=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+FROM=20= regress_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+SET=20SESSION=20AUTHORIZATION=20regress_admin;=0A+GRANT=20SET=20= VALUE,=20ALTER=20SYSTEM=20ON=20SETTING=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= +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+SET=20SESSION=20AUTHORIZATION=20regress_admin;=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=20SETTING=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+SET=20SESSION=20= AUTHORIZATION=20regress_admin;=0A+DROP=20ROLE=20= regress_host_resource_admin;=20=20--=20fail,=20privileges=20remain=0A= +DROP=20ROLE=20regress_host_resource_newadmin;=20=20--=20ok,=20nothing=20= was=20transferred=0A+--=20Use=20"drop=20owned=20by"=20so=20we=20can=20= drop=20the=20role=0A+DROP=20OWNED=20BY=20regress_host_resource_admin;=20=20= --=20ok=0A+DROP=20ROLE=20regress_host_resource_admin;=20=20--=20ok=0A= diff=20--git=20a/src/test/regress/sql/privileges.sql=20= b/src/test/regress/sql/privileges.sql=0Aindex=20c8c545b64c..9f1f436b33=20= 100644=0A---=20a/src/test/regress/sql/privileges.sql=0A+++=20= b/src/test/regress/sql/privileges.sql=0A@@=20-66,6=20+66,33=20@@=20DROP=20= USER=20regress_priv_user10;=0A=20DROP=20USER=20regress_priv_user9;=0A=20= DROP=20USER=20regress_priv_user8;=0A=20=0A+GRANT=20SET=20VALUE=20ON=20= SETTING=20enable_memoize=20TO=20regress_priv_user6;=0A+GRANT=20SET=20= VALUE=20ON=20SETTING=20enable_nestloop=20TO=20regress_priv_user6;=0A+=0A= +SET=20ROLE=20regress_priv_user6;=0A+SET=20enable_memoize=20TO=20false;=0A= +SET=20enable_nestloop=20TO=20false;=0A+RESET=20enable_memoize;=0A+RESET=20= enable_nestloop;=0A+RESET=20ROLE;=0A+=0A+GRANT=20ALTER=20SYSTEM=20ON=20= SETTING=20enable_seqscan=20TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20sort_mem=20TO=20regress_priv_user7;=20--=20= old=20name=20for=20"work_mem"=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= maintenance_work_mem=20TO=20regress_priv_user7;=20--=20ok=0A+GRANT=20= ALTER=20SYSTEM=20ON=20SETTING=20no_such_param=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= no_such_extension.no_such_param=20TO=20regress_priv_user7;=20--=20ok=0A= +GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= no_such_extension.no_such_param.longer.than.maximum.namedata.length=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20= ""=20TO=20regress_priv_user7;=20--=20bad=20name=0A+GRANT=20ALTER=20= SYSTEM=20ON=20SETTING=20"=20"=20TO=20regress_priv_user7;=20--=20bad=20= name=0A+GRANT=20ALTER=20SYSTEM=20ON=20SETTING=20"=20foo=20"=20TO=20= regress_priv_user7;=20--=20bad=20name=0A+=0A+GRANT=20SELECT=20ON=20= public.persons2=20TO=20regress_priv_user7;=0A+=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+=0A=20= CREATE=20GROUP=20regress_priv_group1;=0A=20CREATE=20GROUP=20= regress_priv_group2=20WITH=20USER=20regress_priv_user1,=20= regress_priv_user2;=0A=20=0A@@=20-1426,10=20+1453,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=20SETTING=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20= ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20SETTING=20work_mem=20FROM=20= regress_priv_user7;=20--=20ok,=20use=20new=20name=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20SETTING=20vacuum_mem=20FROM=20regress_priv_user7;=20--=20= ok,=20use=20old=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20SETTING=20= no_such_param=20FROM=20regress_priv_user7;=20--=20ok=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20SETTING=20no_such_extension.no_such_param=20FROM=20= regress_priv_user7;=20--=20ok=0A+REVOKE=20ALTER=20SYSTEM=20ON=20SETTING=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=20SETTING=20= enable_memoize=20FROM=20regress_priv_user6;=0A+REVOKE=20SET=20VALUE=20ON=20= SETTING=20enable_nestloop=20FROM=20regress_priv_user6;=0A+=0A+DROP=20= USER=20regress_priv_user6;=20--=20ok=0A=20=0A=20--=20permissions=20with=20= LOCK=20TABLE=0A=20CREATE=20USER=20regress_locktable_user;=0A--=20=0A= 2.35.1=0A=0A= --Apple-Mail=_4460E328-B9A0-4CC4-B012-D7DCEBADE733 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=_4460E328-B9A0-4CC4-B012-D7DCEBADE733--