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 1mmijj-0004i8-Rr for pgsql-hackers@arkaria.postgresql.org; Mon, 15 Nov 2021 20:37:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mmiji-00044F-R8 for pgsql-hackers@arkaria.postgresql.org; Mon, 15 Nov 2021 20:37:54 +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 1mmijh-000446-VA for pgsql-hackers@lists.postgresql.org; Mon, 15 Nov 2021 20:37:54 +0000 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mmijd-0000Ix-5D for pgsql-hackers@postgresql.org; Mon, 15 Nov 2021 20:37:53 +0000 Received: by mail-pj1-x102e.google.com with SMTP id gf14-20020a17090ac7ce00b001a7a2a0b5c3so239665pjb.5 for ; Mon, 15 Nov 2021 12:37:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=from:mime-version:subject:message-id:date:cc:to; bh=HkFi+36DPEJiUcB2HJb9lUQUqCF07vOUgBGWqpSLTV8=; b=LU/TRBnvA5aHy2eyO+DKcbwZUxrzVJMGWWHVVBNxlRENXsqYsG87ozSbwV5o1Q4ppN UVVcS7N9XRTEI5ufWfhlttznK/Gam8aRGTdAHhc6+exUgah95OiGCUluy7BCChPwSLKo tBVt1FfoCjcAC8tiy0Ww494yJkhR+tN5L4B81oeWU7ALIsRhCcb4yqrlCuTZVCiedRV0 XhfgvNs+x454KmpeQ3JHx3IAs2uOd3OXlw3lpx+6ZntRozurhuxDSdrcI7wL8RwTtV3f JncLuD0GD9idHIkl0Rp288Ahg8/01jeAGIxhoTnvjUvwNBHK3+fAzuvQiux7EyVrjMIV sKmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:mime-version:subject:message-id:date:cc:to; bh=HkFi+36DPEJiUcB2HJb9lUQUqCF07vOUgBGWqpSLTV8=; b=Z8HAVnt4XCfMtFxPJFxR52K2d5o3EySf9wWCTEeNQ3b3yH0KK8MyG3q44uS5YomPzQ +ZdwkIeY6UJk5V5WriRK2EdkVVCUJZM4Jk9eNMaE5m6wbW+TxxZwCSnvjLDfXVpqfc8v ctcF9m8nN2e6q17JZZBlrB5gxA36r6MY3ct+VRiu4m16hTZ458A9e9NG7XIaS5+uuDct j9sirG/rfTTlU/QGkDpe+6mx6Ct/Dxz8uxQS2eSnmEx5b34zZjz9mYDjLZl81T+KGa3j 5NMISV8pp1ca6ReVqCX92S46mmvqi71qX4RSF+fbTdMEvLKg+byTlmZdG9sJtPGUaAXc lqbQ== X-Gm-Message-State: AOAM532yKPrebTRB7o8pnVFXHKE4hNHLVtKruEWWjx6LQoy5e37GELer ATdmjYiknP1c0V4e5o3ray6cKPwFf68JEytoCXgqr2YWMXFT3tB1oL/v9vqc+5PyQzGk6xOawE0 Cf1oyPyfwxSimS9Nhj/5PqIsCcqyTX2qczXrdxr5tJ+JglV+iN86jPiuSIYtsk3WjpAegNuhebq +MAM0+KDemcHTzqbkBTWr24lGq9yr6AAiu1dxNDjRltm33W0/XovdfGWyGvWVMGOnVJv8mnkcg0 0RnUM64djyYG4qEKkIgkmeYLyE8bbBQDfCF X-Google-Smtp-Source: ABdhPJwCp26iYatAwaRcD9Tbijp/WSIhJP26ax/ZnBSB0QL+T9SlV53kRfyBwfE4TqmhC7Hz34LEsg== X-Received: by 2002:a17:90b:3b8d:: with SMTP id pc13mr1780838pjb.112.1637008666319; Mon, 15 Nov 2021 12:37:46 -0800 (PST) Received: from laptop280-ma-us.hitronhub.home (24-113-193-150.wavecable.com. [24.113.193.150]) by smtp.gmail.com with ESMTPSA id j1sm71058pfu.47.2021.11.15.12.37.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Nov 2021 12:37:45 -0800 (PST) From: Mark Dilger Content-Type: multipart/mixed; boundary="Apple-Mail=_9F3716BE-6593-4BD1-BF4B-42A0488E8164" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: Granting SET and ALTER SYSTE privileges for GUCs Message-Id: <3D691E20-C1D5-4B80-8BA5-6BEB63AF3029@enterprisedb.com> Date: Mon, 15 Nov 2021 12:37:44 -0800 Cc: Andrew Dunstan To: PostgreSQL-development 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=_9F3716BE-6593-4BD1-BF4B-42A0488E8164 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hackers, In the ongoing effort [1] to reduce the number of tasks which require = operating under superuser privileges, this patch extends the system to = allow, per GUC variable, the ability to SET or ALTER SYSTEM for the = variable. A previous patch set was submitted [2] which created = hard-coded privileged roles with the authority to manage associated = hard-coded sets of GUC variables. This current patch appears superior = in several ways: - It allows much greater flexibility in how roles and GUCs are = associated - Custom GUC variables defined by extensions can be covered by this = approach and perhaps most importantly, - It's what Andrew suggested Granting SET privilege on a USERSET variable makes no practical = difference, but for SUSET variables it does, and granting ALTER SYSTEM = is meaningful for all variables. The patch does not mandate that = non-login roles be created for this, but as a usage suggestion, one = could define a non-login role and assign privileges for a set of GUCs, = such as: CREATE ROLE regress_host_resource_admin NOSUPERUSER; GRANT SET VALUE, ALTER SYSTEM ON autovacuum_work_mem, hash_mem_multiplier, logical_decoding_work_mem, maintenance_work_mem, max_stack_depth, min_dynamic_shared_memory, shared_buffers, temp_buffers, temp_file_limit, work_mem TO regress_host_resource_admin; and then delegate authority to manage the set of GUCs to a non-superuser = by granting membership in non-login role: CREATE ROLE regress_admin_member IN ROLE regress_host_resource_admin; One disadvantage of this approach is that the GUC variables are = represented both in the list of C structures in guc.c and in the new = system catalog pg_config_param's .dat file. Failure to enter a GUC in = the .dat file will result in the inability to grant privileges on the = GUC, at least unless/until you run CREATE CONFIGURATION PARAMETER on the = GUC. (This is, in fact, how extension scripts deal with the issue.) It = would perhaps be better if the list of GUCs were not duplicated, but I = wasn't clever enough to find a clean way to do that without greatly = expanding the patch (nor did I complete prototyping any such thing.) --Apple-Mail=_9F3716BE-6593-4BD1-BF4B-42A0488E8164 Content-Disposition: attachment; filename=v2-0001-Allow-GRANT-of-SET-and-ALTER-SYSTEM-for-variables.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v2-0001-Allow-GRANT-of-SET-and-ALTER-SYSTEM-for-variables.patch" Content-Transfer-Encoding: quoted-printable =46rom=200ff4364bd4dcd1c9e5ed40b047112be4a7cb9311=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Mark=20Dilger=20=0A= Date:=20Mon,=2015=20Nov=202021=2009:19:22=20-0800=0ASubject:=20[PATCH=20= v2]=20Allow=20GRANT=20of=20SET=20and=20ALTER=20SYSTEM=20for=20variables=0A= =0AAllow=20granting=20of=20privilege=20to=20set=20or=20alter=20system=20= set=20variables=0Awhich=20otherwise=20can=20only=20be=20managed=20by=20= superusers.=20=20Each=0A(role,variable,privilege)=20triple=20is=20= independently=20grantable,=20so=20a=0Auser=20may=20be=20granted=20= privilege=20to=20SET=20but=20not=20to=20ALTER=20SYSTEM=20SET=20on=0Aa=20= variable,=20or=20vice=20versa.=20=20The=20privilege=20to=20SET=20a=20= userset=20variable=0Amay=20be=20granted,=20though=20doing=20so=20has=20= no=20practical=20effect,=20since=20any=0Arole=20can=20set=20userset=20= variables=20anyway.=0A=0AAddition=20custom=20variables=20defined=20by=20= extensions=20can=20be=20registered=0Awith=20the=20system=20using=20a=20= new=20command,=20CREATE=20CONFIGURATION=20PARAMETER,=0Afrom=20within=20= the=20extension=20install=20script.=20=20For=20upgrades=20which=20need=0A= to=20drop=20an=20older=20version's=20configuration=20parameters,=20a=20= DROP=0ACONFIGURATION=20PARAMETER=20command=20is=20supplied.=20=20There=20= is=20no=20obvious=0Aother=20use=20for=20these=20new=20commands.=0A---=0A=20= contrib/pg_prewarm/Makefile=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= contrib/pg_prewarm/pg_prewarm--1.2--1.3.sql=20=20=20|=20=20=207=20+=0A=20= contrib/pg_prewarm/pg_prewarm.control=20=20=20=20=20=20=20=20=20|=20=20=20= 2=20+-=0A=20contrib/pg_stat_statements/Makefile=20=20=20=20=20=20=20=20=20= =20=20|=20=20=203=20+-=0A=20.../expected/oldextversions.out=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=20=2051=20++++=0A=20= .../expected/pg_stat_statements.out=20=20=20=20=20=20=20=20=20=20=20|=20=20= 17=20++=0A=20.../pg_stat_statements--1.9--1.10.sql=20=20=20=20=20=20=20=20= =20|=20=2010=20+=0A=20.../pg_stat_statements/pg_stat_statements.c=20=20=20= |=20=2014=20+-=0A=20.../pg_stat_statements.control=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20|=20=20=202=20+-=0A=20= .../pg_stat_statements/sql/oldextversions.sql=20|=20=20=205=20+=0A=20= .../sql/pg_stat_statements.sql=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=2011=20+=0A=20contrib/pg_trgm/Makefile=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=206=20+-=0A=20= contrib/pg_trgm/pg_trgm--1.6--1.7.sql=20=20=20=20=20=20=20=20=20|=20=20=20= 8=20+=0A=20contrib/pg_trgm/pg_trgm.control=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20|=20=20=202=20+-=0A=20contrib/postgres_fdw/Makefile=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=203=20+-=0A=20= .../postgres_fdw/postgres_fdw--1.1--1.2.sql=20=20=20|=20=20=206=20+=0A=20= contrib/postgres_fdw/postgres_fdw.control=20=20=20=20=20|=20=20=202=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=20|=20=2039=20++-=0A=20doc/src/sgml/ref/grant.sgml=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=207=20+=0A=20= doc/src/sgml/ref/set.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20=20=205=20+-=0A=20src/backend/catalog/Makefile=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=205=20+-=0A=20= src/backend/catalog/aclchk.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20274=20++++++++++++++++++=0A=20src/backend/catalog/catalog.c=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=206=20+=0A=20= src/backend/catalog/dependency.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=20=206=20+=0A=20src/backend/catalog/objectaddress.c=20=20=20=20=20=20= =20=20=20=20=20|=20=2049=20++++=0A=20= src/backend/catalog/pg_config_param.c=20=20=20=20=20=20=20=20=20|=20143=20= +++++++++=0A=20src/backend/commands/Makefile=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=20=201=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|=20=20=201=20+=0A=20= src/backend/commands/configcmds.c=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=2080=20+++++=0A=20src/backend/commands/dropcmds.c=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20|=20=20=207=20+=0A=20= src/backend/commands/event_trigger.c=20=20=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|=20=20=201=20+=0A=20src/backend/commands/tablecmds.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/backend/nodes/copyfuncs.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20|=20=2028=20++=0A=20src/backend/nodes/equalfuncs.c=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=20=2024=20++=0A=20= src/backend/parser/gram.y=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20138=20++++++++-=0A=20src/backend/tcop/utility.c=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2032=20++=0A=20= src/backend/utils/adt/acl.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=2058=20++++=0A=20src/backend/utils/cache/lsyscache.c=20=20=20= =20=20=20=20=20=20=20=20|=20=2020=20++=0A=20= src/backend/utils/cache/syscache.c=20=20=20=20=20=20=20=20=20=20=20=20|=20= =2023=20++=0A=20src/backend/utils/misc/README=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=2011=20+=0A=20src/backend/utils/misc/guc.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2063=20+++-=0A=20= src/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|=20=20=203=20+=0A=20src/include/catalog/dependency.h=20=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/include/catalog/pg_config_param.dat=20=20=20=20=20=20=20|=20211=20= ++++++++++++++=0A=20src/include/catalog/pg_config_param.h=20=20=20=20=20=20= =20=20=20|=20=2061=20++++=0A=20src/include/catalog/pg_default_acl.h=20=20= =20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/include/commands/configcmds.h=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=2017=20++=0A=20src/include/nodes/nodes.h=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20=20=202=20+=0A=20= src/include/nodes/parsenodes.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=2027=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|=20=20=201=20+=0A=20= src/include/tcop/cmdtaglist.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20|=20=20=202=20+=0A=20src/include/utils/acl.h=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2011=20+-=0A=20= src/include/utils/guc.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20|=20=20=201=20+=0A=20src/include/utils/lsyscache.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/syscache.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=20=202=20+=0A=20src/test/modules/test_extensions/Makefile=20= =20=20=20=20|=20=20=203=20+-=0A=20= .../test_extensions/test_ext9--1.0--1.1.sql=20=20=20|=20=2012=20+=0A=20= .../test_extensions/test_ext9--1.0.sql=20=20=20=20=20=20=20=20|=20=2012=20= +=0A=20.../modules/test_extensions/test_ext9.control=20|=20=20=204=20+=0A= =20src/test/regress/expected/guc_privs.out=20=20=20=20=20=20=20|=20144=20= +++++++++=0A=20src/test/regress/expected/oidjoins.out=20=20=20=20=20=20=20= =20|=20=20=201=20+=0A=20src/test/regress/expected/privileges.out=20=20=20= =20=20=20|=20=2040=20++-=0A=20src/test/regress/expected/sanity_check.out=20= =20=20=20|=20=20=201=20+=0A=20src/test/regress/parallel_schedule=20=20=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=20=20|=20= 106=20+++++++=0A=20src/test/regress/sql/privileges.sql=20=20=20=20=20=20=20= =20=20=20=20|=20=2037=20++-=0A=20src/tools/pgindent/typedefs.list=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=2068=20files=20= changed,=201847=20insertions(+),=2037=20deletions(-)=0A=20create=20mode=20= 100644=20contrib/pg_prewarm/pg_prewarm--1.2--1.3.sql=0A=20create=20mode=20= 100644=20contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql=0A=20= create=20mode=20100644=20contrib/pg_trgm/pg_trgm--1.6--1.7.sql=0A=20= create=20mode=20100644=20contrib/postgres_fdw/postgres_fdw--1.1--1.2.sql=0A= =20create=20mode=20100644=20src/backend/catalog/pg_config_param.c=0A=20= create=20mode=20100644=20src/backend/commands/configcmds.c=0A=20create=20= mode=20100644=20src/include/catalog/pg_config_param.dat=0A=20create=20= mode=20100644=20src/include/catalog/pg_config_param.h=0A=20create=20mode=20= 100644=20src/include/commands/configcmds.h=0A=20create=20mode=20100644=20= src/test/modules/test_extensions/test_ext9--1.0--1.1.sql=0A=20create=20= mode=20100644=20src/test/modules/test_extensions/test_ext9--1.0.sql=0A=20= create=20mode=20100644=20= src/test/modules/test_extensions/test_ext9.control=0A=20create=20mode=20= 100644=20src/test/regress/expected/guc_privs.out=0A=20create=20mode=20= 100644=20src/test/regress/sql/guc_privs.sql=0A=0Adiff=20--git=20= a/contrib/pg_prewarm/Makefile=20b/contrib/pg_prewarm/Makefile=0Aindex=20= b13ac3c813..1f4bccb807=20100644=0A---=20a/contrib/pg_prewarm/Makefile=0A= +++=20b/contrib/pg_prewarm/Makefile=0A@@=20-7,7=20+7,8=20@@=20OBJS=20=3D=20= \=0A=20=09pg_prewarm.o=0A=20=0A=20EXTENSION=20=3D=20pg_prewarm=0A-DATA=20= =3D=20pg_prewarm--1.1--1.2.sql=20pg_prewarm--1.1.sql=20= pg_prewarm--1.0--1.1.sql=0A+DATA=20=3D=20pg_prewarm--1.2--1.3.sql=20= pg_prewarm--1.1--1.2.sql=20pg_prewarm--1.1.sql=20\=0A+=09=20=20=20= pg_prewarm--1.0--1.1.sql=0A=20PGFILEDESC=20=3D=20"pg_prewarm=20-=20= preload=20relation=20data=20into=20system=20buffer=20cache"=0A=20=0A=20= ifdef=20USE_PGXS=0Adiff=20--git=20= a/contrib/pg_prewarm/pg_prewarm--1.2--1.3.sql=20= b/contrib/pg_prewarm/pg_prewarm--1.2--1.3.sql=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..87ca3fd637=0A---=20/dev/null=0A+++=20= b/contrib/pg_prewarm/pg_prewarm--1.2--1.3.sql=0A@@=20-0,0=20+1,7=20@@=0A= +/*=20contrib/pg_prewarm/pg_prewarm-1.2--1.3.sql=20*/=0A+=0A+--=20= complain=20if=20script=20is=20sourced=20in=20psql,=20rather=20than=20via=20= ALTER=20EXTENSION=0A+\echo=20Use=20"ALTER=20EXTENSION=20pg_prewarm=20= UPDATE=20TO=20'1.3'"=20to=20load=20this=20file.=20\quit=0A+=0A+CREATE=20= CONFIGURATION=20PARAMETER=20IF=20NOT=20EXISTS=20= 'pg_prewarm.autoprewarm_interval';=0A+CREATE=20CONFIGURATION=20PARAMETER=20= IF=20NOT=20EXISTS=20'pg_prewarm.autoprewarm';=0Adiff=20--git=20= a/contrib/pg_prewarm/pg_prewarm.control=20= b/contrib/pg_prewarm/pg_prewarm.control=0Aindex=2040e3add481..cb97cf6f13=20= 100644=0A---=20a/contrib/pg_prewarm/pg_prewarm.control=0A+++=20= b/contrib/pg_prewarm/pg_prewarm.control=0A@@=20-1,5=20+1,5=20@@=0A=20#=20= pg_prewarm=20extension=0A=20comment=20=3D=20'prewarm=20relation=20data'=0A= -default_version=20=3D=20'1.2'=0A+default_version=20=3D=20'1.3'=0A=20= module_pathname=20=3D=20'$libdir/pg_prewarm'=0A=20relocatable=20=3D=20= true=0Adiff=20--git=20a/contrib/pg_stat_statements/Makefile=20= b/contrib/pg_stat_statements/Makefile=0Aindex=207fabd96f38..3d01fdb410=20= 100644=0A---=20a/contrib/pg_stat_statements/Makefile=0A+++=20= b/contrib/pg_stat_statements/Makefile=0A@@=20-6,7=20+6,8=20@@=20OBJS=20=3D= =20\=0A=20=09pg_stat_statements.o=0A=20=0A=20EXTENSION=20=3D=20= pg_stat_statements=0A-DATA=20=3D=20pg_stat_statements--1.4.sql=20= pg_stat_statements--1.8--1.9.sql=20\=0A+DATA=20=3D=20= pg_stat_statements--1.4.sql=20\=0A+=09pg_stat_statements--1.8--1.9.sql=20= pg_stat_statements--1.9--1.10.sql=20\=0A=20=09= pg_stat_statements--1.7--1.8.sql=20pg_stat_statements--1.6--1.7.sql=20\=0A= =20=09pg_stat_statements--1.5--1.6.sql=20= pg_stat_statements--1.4--1.5.sql=20\=0A=20=09= pg_stat_statements--1.3--1.4.sql=20pg_stat_statements--1.2--1.3.sql=20\=0A= diff=20--git=20a/contrib/pg_stat_statements/expected/oldextversions.out=20= b/contrib/pg_stat_statements/expected/oldextversions.out=0Aindex=20= f18c08838f..f206a0f0ef=20100644=0A---=20= a/contrib/pg_stat_statements/expected/oldextversions.out=0A+++=20= b/contrib/pg_stat_statements/expected/oldextversions.out=0A@@=20-136,4=20= +136,55=20@@=20SELECT=20= pg_get_functiondef('pg_stat_statements_reset'::regproc);=0A=20=20=0A=20= (1=20row)=0A=20=0A+--=20Grantable=20privileges=20on=20GUCs=20for=20= pg_stat_statements=20in=201.10=0A+AlTER=20EXTENSION=20pg_stat_statements=20= UPDATE=20TO=20'1.10';=0A+\d=20pg_stat_statements=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20View=20= "public.pg_stat_statements"=0A+=20=20=20=20=20=20=20Column=20=20=20=20=20= =20=20=20|=20=20=20=20=20=20=20Type=20=20=20=20=20=20=20|=20Collation=20= |=20Nullable=20|=20Default=20=0A= +---------------------+------------------+-----------+----------+---------= =0A+=20userid=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20oid=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+=20dbid=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20oid=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+=20toplevel=20=20= =20=20=20=20=20=20=20=20=20=20|=20boolean=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+=20= queryid=20=20=20=20=20=20=20=20=20=20=20=20=20|=20bigint=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+=20query=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= text=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+=20plans=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20bigint=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+=20= total_plan_time=20=20=20=20=20|=20double=20precision=20|=20=20=20=20=20=20= =20=20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20min_plan_time=20= =20=20=20=20=20=20|=20double=20precision=20|=20=20=20=20=20=20=20=20=20=20= =20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20max_plan_time=20=20=20=20=20= =20=20|=20double=20precision=20|=20=20=20=20=20=20=20=20=20=20=20|=20=20=20= =20=20=20=20=20=20=20|=20=0A+=20mean_plan_time=20=20=20=20=20=20|=20= double=20precision=20|=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20=20= =20=20=20=20|=20=0A+=20stddev_plan_time=20=20=20=20|=20double=20= precision=20|=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20= =20|=20=0A+=20calls=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= bigint=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+=20total_exec_time=20=20=20=20=20= |=20double=20precision=20|=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20= =20=20=20=20=20|=20=0A+=20min_exec_time=20=20=20=20=20=20=20|=20double=20= precision=20|=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20= =20|=20=0A+=20max_exec_time=20=20=20=20=20=20=20|=20double=20precision=20= |=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A= +=20mean_exec_time=20=20=20=20=20=20|=20double=20precision=20|=20=20=20=20= =20=20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20= stddev_exec_time=20=20=20=20|=20double=20precision=20|=20=20=20=20=20=20=20= =20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20rows=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20|=20bigint=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= +=20shared_blks_hit=20=20=20=20=20|=20bigint=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= +=20shared_blks_read=20=20=20=20|=20bigint=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= +=20shared_blks_dirtied=20|=20bigint=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+=20= shared_blks_written=20|=20bigint=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+=20= local_blks_hit=20=20=20=20=20=20|=20bigint=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= +=20local_blks_read=20=20=20=20=20|=20bigint=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= +=20local_blks_dirtied=20=20|=20bigint=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+=20= local_blks_written=20=20|=20bigint=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+=20= temp_blks_read=20=20=20=20=20=20|=20bigint=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= +=20temp_blks_written=20=20=20|=20bigint=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= +=20blk_read_time=20=20=20=20=20=20=20|=20double=20precision=20|=20=20=20= =20=20=20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20= blk_write_time=20=20=20=20=20=20|=20double=20precision=20|=20=20=20=20=20= =20=20=20=20=20=20|=20=20=20=20=20=20=20=20=20=20|=20=0A+=20wal_records=20= =20=20=20=20=20=20=20=20|=20bigint=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+=20= wal_fpi=20=20=20=20=20=20=20=20=20=20=20=20=20|=20bigint=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+=20wal_bytes=20=20=20=20=20=20=20=20=20=20=20|=20numeric=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+=0A+SELECT=20= pg_get_functiondef('pg_stat_statements_reset'::regproc);=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=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= pg_get_functiondef=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=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=0A= +-------------------------------------------------------------------------= -------------------------------------------------------=0A+=20CREATE=20= OR=20REPLACE=20FUNCTION=20public.pg_stat_statements_reset(userid=20oid=20= DEFAULT=200,=20dbid=20oid=20DEFAULT=200,=20queryid=20bigint=20DEFAULT=20= 0)+=0A+=20=20RETURNS=20void=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=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=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+=20= =20LANGUAGE=20c=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=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=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=20+=0A+=20=20= PARALLEL=20SAFE=20STRICT=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=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=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+=20AS=20= '$libdir/pg_stat_statements',=20= $function$pg_stat_statements_reset_1_7$function$=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=20=20=20=20=20=20=20+=0A+=20=0A+(1=20row)=0A+=0A=20DROP=20= EXTENSION=20pg_stat_statements;=0Adiff=20--git=20= a/contrib/pg_stat_statements/expected/pg_stat_statements.out=20= b/contrib/pg_stat_statements/expected/pg_stat_statements.out=0Aindex=20= b52d187722..580a1e3aef=20100644=0A---=20= a/contrib/pg_stat_statements/expected/pg_stat_statements.out=0A+++=20= b/contrib/pg_stat_statements/expected/pg_stat_statements.out=0A@@=20= -1077,4=20+1077,21=20@@=20SELECT=20COUNT(*)=20FROM=20pg_stat_statements=20= WHERE=20query=20LIKE=20'%SELECT=20GROUPING%';=0A=20=20=20=20=20=202=0A=20= (1=20row)=0A=20=0A+--=20CUSTOM=20GUCS=20FROM=20THIS=20EXTENSION=0A+SHOW=20= pg_stat_statements.max;=0A+=20pg_stat_statements.max=20=0A= +------------------------=0A+=205000=0A+(1=20row)=0A+=0A+CREATE=20ROLE=20= regress_stat_admin;=0A+GRANT=20ALTER=20SYSTEM=20ON=20= pg_stat_statements.max=20TO=20regress_stat_admin;=0A+SET=20SESSION=20= AUTHORIZATION=20regress_stat_admin;=0A+ALTER=20SYSTEM=20SET=20= pg_stat_statements.max=20=3D=203000;=0A+RESET=20SESSION=20AUTHORIZATION;=0A= +DROP=20ROLE=20regress_stat_admin;=0A+ERROR:=20=20role=20= "regress_stat_admin"=20cannot=20be=20dropped=20because=20some=20objects=20= depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20configuration=20= parameter=20pg_stat_statements.max=0A+REVOKE=20ALTER=20SYSTEM=20ON=20= pg_stat_statements.max=20FROM=20regress_stat_admin;=0A+DROP=20ROLE=20= regress_stat_admin;=0A=20DROP=20EXTENSION=20pg_stat_statements;=0Adiff=20= --git=20a/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql=20= b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql=0Anew=20= file=20mode=20100644=0Aindex=200000000000..5e2c525297=0A---=20/dev/null=0A= +++=20b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql=0A= @@=20-0,0=20+1,10=20@@=0A+/*=20= contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql=20*/=0A+=0A= +--=20complain=20if=20script=20is=20sourced=20in=20psql,=20rather=20than=20= via=20ALTER=20EXTENSION=0A+\echo=20Use=20"ALTER=20EXTENSION=20= pg_stat_statements=20UPDATE=20TO=20'1.10'"=20to=20load=20this=20file.=20= \quit=0A+=0A+CREATE=20CONFIGURATION=20PARAMETER=20IF=20NOT=20EXISTS=20= 'pg_stat_statements.max';=0A+CREATE=20CONFIGURATION=20PARAMETER=20IF=20= NOT=20EXISTS=20'pg_stat_statements.track';=0A+CREATE=20CONFIGURATION=20= PARAMETER=20IF=20NOT=20EXISTS=20'pg_stat_statements.track_utility';=0A= +CREATE=20CONFIGURATION=20PARAMETER=20IF=20NOT=20EXISTS=20= 'pg_stat_statements.track_planning';=0A+CREATE=20CONFIGURATION=20= PARAMETER=20IF=20NOT=20EXISTS=20'pg_stat_statements.save';=0Adiff=20= --git=20a/contrib/pg_stat_statements/pg_stat_statements.c=20= b/contrib/pg_stat_statements/pg_stat_statements.c=0Aindex=20= 726ba59e2b..db6e7c54a9=20100644=0A---=20= a/contrib/pg_stat_statements/pg_stat_statements.c=0A+++=20= b/contrib/pg_stat_statements/pg_stat_statements.c=0A@@=20-121,7=20+121,8=20= @@=20typedef=20enum=20pgssVersion=0A=20=09PGSS_V1_2,=0A=20=09PGSS_V1_3,=0A= =20=09PGSS_V1_8,=0A-=09PGSS_V1_9=0A+=09PGSS_V1_9,=0A+=09PGSS_V1_10=0A=20= }=20pgssVersion;=0A=20=0A=20typedef=20enum=20pgssStoreKind=0A@@=20-302,6=20= +303,7=20@@=20PG_FUNCTION_INFO_V1(pg_stat_statements_1_2);=0A=20= PG_FUNCTION_INFO_V1(pg_stat_statements_1_3);=0A=20= PG_FUNCTION_INFO_V1(pg_stat_statements_1_8);=0A=20= PG_FUNCTION_INFO_V1(pg_stat_statements_1_9);=0A= +PG_FUNCTION_INFO_V1(pg_stat_statements_1_10);=0A=20= PG_FUNCTION_INFO_V1(pg_stat_statements);=0A=20= PG_FUNCTION_INFO_V1(pg_stat_statements_info);=0A=20=0A@@=20-1438,6=20= +1440,16=20@@=20pg_stat_statements_reset(PG_FUNCTION_ARGS)=0A=20=20*=20= expected=20API=20version=20is=20identified=20by=20embedding=20it=20in=20= the=20C=20name=20of=20the=0A=20=20*=20function.=20=20Unfortunately=20we=20= weren't=20bright=20enough=20to=20do=20that=20for=201.1.=0A=20=20*/=0A= +Datum=0A+pg_stat_statements_1_10(PG_FUNCTION_ARGS)=0A+{=0A+=09bool=09=09= showtext=20=3D=20PG_GETARG_BOOL(0);=0A+=0A+=09= pg_stat_statements_internal(fcinfo,=20PGSS_V1_10,=20showtext);=0A+=0A+=09= return=20(Datum)=200;=0A+}=0A+=0A=20Datum=0A=20= pg_stat_statements_1_9(PG_FUNCTION_ARGS)=0A=20{=0Adiff=20--git=20= a/contrib/pg_stat_statements/pg_stat_statements.control=20= b/contrib/pg_stat_statements/pg_stat_statements.control=0Aindex=20= 2f1ce6ed50..0747e48138=20100644=0A---=20= a/contrib/pg_stat_statements/pg_stat_statements.control=0A+++=20= b/contrib/pg_stat_statements/pg_stat_statements.control=0A@@=20-1,5=20= +1,5=20@@=0A=20#=20pg_stat_statements=20extension=0A=20comment=20=3D=20= 'track=20planning=20and=20execution=20statistics=20of=20all=20SQL=20= statements=20executed'=0A-default_version=20=3D=20'1.9'=0A= +default_version=20=3D=20'1.10'=0A=20module_pathname=20=3D=20= '$libdir/pg_stat_statements'=0A=20relocatable=20=3D=20true=0Adiff=20= --git=20a/contrib/pg_stat_statements/sql/oldextversions.sql=20= b/contrib/pg_stat_statements/sql/oldextversions.sql=0Aindex=20= f2e822acd3..ea1f1cdd19=20100644=0A---=20= a/contrib/pg_stat_statements/sql/oldextversions.sql=0A+++=20= b/contrib/pg_stat_statements/sql/oldextversions.sql=0A@@=20-36,4=20+36,9=20= @@=20AlTER=20EXTENSION=20pg_stat_statements=20UPDATE=20TO=20'1.8';=0A=20= \d=20pg_stat_statements=0A=20SELECT=20= pg_get_functiondef('pg_stat_statements_reset'::regproc);=0A=20=0A+--=20= Grantable=20privileges=20on=20GUCs=20for=20pg_stat_statements=20in=20= 1.10=0A+AlTER=20EXTENSION=20pg_stat_statements=20UPDATE=20TO=20'1.10';=0A= +\d=20pg_stat_statements=0A+SELECT=20= pg_get_functiondef('pg_stat_statements_reset'::regproc);=0A+=0A=20DROP=20= EXTENSION=20pg_stat_statements;=0Adiff=20--git=20= a/contrib/pg_stat_statements/sql/pg_stat_statements.sql=20= b/contrib/pg_stat_statements/sql/pg_stat_statements.sql=0Aindex=20= dffd2c8c18..a762136ce6=20100644=0A---=20= a/contrib/pg_stat_statements/sql/pg_stat_statements.sql=0A+++=20= b/contrib/pg_stat_statements/sql/pg_stat_statements.sql=0A@@=20-442,4=20= +442,15=20@@=20SELECT=20(=0A=20=0A=20SELECT=20COUNT(*)=20FROM=20= pg_stat_statements=20WHERE=20query=20LIKE=20'%SELECT=20GROUPING%';=0A=20=0A= +--=20CUSTOM=20GUCS=20FROM=20THIS=20EXTENSION=0A+SHOW=20= pg_stat_statements.max;=0A+CREATE=20ROLE=20regress_stat_admin;=0A+GRANT=20= ALTER=20SYSTEM=20ON=20pg_stat_statements.max=20TO=20regress_stat_admin;=0A= +SET=20SESSION=20AUTHORIZATION=20regress_stat_admin;=0A+ALTER=20SYSTEM=20= SET=20pg_stat_statements.max=20=3D=203000;=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+DROP=20ROLE=20regress_stat_admin;=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20pg_stat_statements.max=20FROM=20regress_stat_admin;=0A= +DROP=20ROLE=20regress_stat_admin;=0A+=0A=20DROP=20EXTENSION=20= pg_stat_statements;=0Adiff=20--git=20a/contrib/pg_trgm/Makefile=20= b/contrib/pg_trgm/Makefile=0Aindex=201fbdc9ec1e..8fac4f6289=20100644=0A= ---=20a/contrib/pg_trgm/Makefile=0A+++=20b/contrib/pg_trgm/Makefile=0A@@=20= -9,9=20+9,9=20@@=20OBJS=20=3D=20\=0A=20=09trgm_regexp.o=0A=20=0A=20= EXTENSION=20=3D=20pg_trgm=0A-DATA=20=3D=20pg_trgm--1.5--1.6.sql=20= pg_trgm--1.4--1.5.sql=20pg_trgm--1.3--1.4.sql=20\=0A-=09pg_trgm--1.3.sql=20= pg_trgm--1.2--1.3.sql=20pg_trgm--1.1--1.2.sql=20\=0A-=09= pg_trgm--1.0--1.1.sql=0A+DATA=20=3D=20pg_trgm--1.6--1.7.sql=20= pg_trgm--1.5--1.6.sql=20pg_trgm--1.4--1.5.sql=20\=0A+=09= pg_trgm--1.3--1.4.sql=20pg_trgm--1.3.sql=20pg_trgm--1.2--1.3.sql=20\=0A+=09= pg_trgm--1.1--1.2.sql=20pg_trgm--1.0--1.1.sql=0A=20PGFILEDESC=20=3D=20= "pg_trgm=20-=20trigram=20matching"=0A=20=0A=20REGRESS=20=3D=20pg_trgm=20= pg_word_trgm=20pg_strict_word_trgm=0Adiff=20--git=20= a/contrib/pg_trgm/pg_trgm--1.6--1.7.sql=20= b/contrib/pg_trgm/pg_trgm--1.6--1.7.sql=0Anew=20file=20mode=20100644=0A= index=200000000000..509f9c98ff=0A---=20/dev/null=0A+++=20= b/contrib/pg_trgm/pg_trgm--1.6--1.7.sql=0A@@=20-0,0=20+1,8=20@@=0A+/*=20= contrib/pg_trgm/pg_trgm--1.6--1.7.sql=20*/=0A+=0A+--=20complain=20if=20= script=20is=20sourced=20in=20psql,=20rather=20than=20via=20ALTER=20= EXTENSION=0A+\echo=20Use=20"ALTER=20EXTENSION=20pg_trgm=20UPDATE=20TO=20= '1.7'"=20to=20load=20this=20file.=20\quit=0A+=0A+CREATE=20CONFIGURATION=20= PARAMETER=20IF=20NOT=20EXISTS=20'pg_trgm.similarity_threshold';=0A= +CREATE=20CONFIGURATION=20PARAMETER=20IF=20NOT=20EXISTS=20= 'pg_trgm.word_similarity_threshold';=0A+CREATE=20CONFIGURATION=20= PARAMETER=20IF=20NOT=20EXISTS=20= 'pg_trgm.strict_word_similarity_threshold';=0Adiff=20--git=20= a/contrib/pg_trgm/pg_trgm.control=20b/contrib/pg_trgm/pg_trgm.control=0A= index=201d6a9ddf25..6e3ee43c51=20100644=0A---=20= a/contrib/pg_trgm/pg_trgm.control=0A+++=20= b/contrib/pg_trgm/pg_trgm.control=0A@@=20-1,6=20+1,6=20@@=0A=20#=20= pg_trgm=20extension=0A=20comment=20=3D=20'text=20similarity=20= measurement=20and=20index=20searching=20based=20on=20trigrams'=0A= -default_version=20=3D=20'1.6'=0A+default_version=20=3D=20'1.7'=0A=20= module_pathname=20=3D=20'$libdir/pg_trgm'=0A=20relocatable=20=3D=20true=0A= =20trusted=20=3D=20true=0Adiff=20--git=20a/contrib/postgres_fdw/Makefile=20= b/contrib/postgres_fdw/Makefile=0Aindex=20c1b0cad453..3564015ee8=20= 100644=0A---=20a/contrib/postgres_fdw/Makefile=0A+++=20= b/contrib/postgres_fdw/Makefile=0A@@=20-14,7=20+14,8=20@@=20PG_CPPFLAGS=20= =3D=20-I$(libpq_srcdir)=0A=20SHLIB_LINK_INTERNAL=20=3D=20$(libpq)=0A=20=0A= =20EXTENSION=20=3D=20postgres_fdw=0A-DATA=20=3D=20postgres_fdw--1.0.sql=20= postgres_fdw--1.0--1.1.sql=0A+DATA=20=3D=20postgres_fdw--1.0.sql=20= postgres_fdw--1.0--1.1.sql=20\=0A+=09postgres_fdw--1.1--1.2.sql=0A=20=0A=20= REGRESS=20=3D=20postgres_fdw=0A=20=0Adiff=20--git=20= a/contrib/postgres_fdw/postgres_fdw--1.1--1.2.sql=20= b/contrib/postgres_fdw/postgres_fdw--1.1--1.2.sql=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..e8fbe245f3=0A---=20/dev/null=0A+++=20= b/contrib/postgres_fdw/postgres_fdw--1.1--1.2.sql=0A@@=20-0,0=20+1,6=20= @@=0A+/*=20contrib/postgres_fdw/postgres_fdw--1.1--1.2.sql=20*/=0A+=0A= +--=20complain=20if=20script=20is=20sourced=20in=20psql,=20rather=20than=20= via=20ALTER=20EXTENSION=0A+\echo=20Use=20"ALTER=20EXTENSION=20= postgres_fdw=20UPDATE=20TO=20'1.2'"=20to=20load=20this=20file.=20\quit=0A= +=0A+CREATE=20CONFIGURATION=20PARAMETER=20IF=20NOT=20EXISTS=20= 'postgres_fdw.application_name';=0Adiff=20--git=20= a/contrib/postgres_fdw/postgres_fdw.control=20= b/contrib/postgres_fdw/postgres_fdw.control=0Aindex=20= d489382064..a4b800be4f=20100644=0A---=20= a/contrib/postgres_fdw/postgres_fdw.control=0A+++=20= b/contrib/postgres_fdw/postgres_fdw.control=0A@@=20-1,5=20+1,5=20@@=0A=20= #=20postgres_fdw=20extension=0A=20comment=20=3D=20'foreign-data=20= wrapper=20for=20remote=20PostgreSQL=20servers'=0A-default_version=20=3D=20= '1.1'=0A+default_version=20=3D=20'1.2'=0A=20module_pathname=20=3D=20= '$libdir/postgres_fdw'=0A=20relocatable=20=3D=20true=0Adiff=20--git=20= a/doc/src/sgml/ddl.sgml=20b/doc/src/sgml/ddl.sgml=0Aindex=20= 94f745aed0..d862ab8c0e=20100644=0A---=20a/doc/src/sgml/ddl.sgml=0A+++=20= b/doc/src/sgml/ddl.sgml=0A@@=20-1620,7=20+1620,8=20@@=20ALTER=20TABLE=20= products=20RENAME=20TO=20items;=0A=20=20=20=20INSERT,=20= UPDATE,=20DELETE,=0A=20=20=20=20= TRUNCATE,=20REFERENCES,=20= TRIGGER,=0A=20=20=20=20CREATE,=20= CONNECT,=20TEMPORARY,=0A-=20=20=20= EXECUTE,=20and=20USAGE.=0A+=20=20=20= EXECUTE,=20USAGE,=20SET=20= VALUE=0A+=20=20=20and=20ALTER=20SYSTEM.=0A=20= =20=20=20The=20privileges=20applicable=20to=20a=20particular=0A=20=20=20=20= object=20vary=20depending=20on=20the=20object's=20type=20(table,=20= function,=20etc).=0A=20=20=20=20More=20detail=20about=20the=20meanings=20= of=20these=20privileges=20appears=20below.=0A@@=20-1888,6=20+1889,26=20= @@=20REVOKE=20ALL=20ON=20accounts=20FROM=20PUBLIC;=0A=20=20=20=20=20=20=20= =0A=20=20=20=20=20=20=0A=20=20=20=20=20=0A= +=0A+=20=20=20=20=0A+=20=20=20=20=20SET=20= VALUE=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20Allows=20non-superuser=20roles=20to=20use=20= the=20SET=20command=20to=0A+=20=20=20=20=20=20=20= change=20run-time=20configuration=20parameters.=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=0A+=20=20=20=20=0A+=0A= +=20=20=20=20=0A+=20=20=20=20=20ALTER=20= SYSTEM=0A+=20=20=20=20=20=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=20=20Allows=20non-superuser=20roles=20to=20use=20= the=20ALTER=20SYSTEM=0A+=20=20=20=20=20=20=20SET=20= command=20to=20change=20server=20configuration=20parameters.=0A+=20=20=20= =20=20=20=0A+=20=20=20=20=20=0A+=20=20=20=20= =0A=20=20=20=20=0A=20=0A=20=20=20=20The=20= privileges=20required=20by=20other=20commands=20are=20listed=20on=20the=0A= @@=20-2026,6=20+2047,16=20@@=20REVOKE=20ALL=20ON=20accounts=20FROM=20= PUBLIC;=0A=20=20=20=20=20=20=20=20TYPE=0A=20=20=20=20=20= =20=20=0A=20=20=20=20=20=20=0A+=20=20=20=20=20=0A+=20=20= =20=20=20=20SET=20VALUE=0A+=20=20=20=20= =20=20s=0A+=20=20=20=20=20=20= configuration=20parameter=0A+=20=20=20=20=20=0A+=20=20= =20=20=20=0A+=20=20=20=20=20=20ALTER=20= SYSTEM=0A+=20=20=20=20=20=20= A=0A+=20=20=20=20=20=20= configuration=20parameter=0A+=20=20=20=20=20=0A=20=20= =20=20=20=20=0A=20=20=20=20=0A=20=20=20=0A@@=20= -2132,6=20+2163,12=20@@=20REVOKE=20ALL=20ON=20accounts=20FROM=20PUBLIC;=0A= =20=20=20=20=20=20=20U=0A=20=20=20=20=20= =20=20\dT+=0A=20=20=20=20=20=20=0A= +=20=20=20=20=20=0A+=20=20=20=20=20=20Configuration=20= parameter=0A+=20=20=20=20=20=20= sA=0A+=20=20=20=20=20=20= none=0A+=20=20=20=20=20=20= =0A+=20=20=20=20=20=0A=20=20=20=20= =20=0A=20=20=20=20=0A=20=20=20=0Adiff=20--git=20= a/doc/src/sgml/ref/grant.sgml=20b/doc/src/sgml/ref/grant.sgml=0Aindex=20= a897712de2..21ec320a8d=20100644=0A---=20a/doc/src/sgml/ref/grant.sgml=0A= +++=20b/doc/src/sgml/ref/grant.sgml=0A@@=20-92,6=20+92,11=20@@=20GRANT=20= {=20USAGE=20|=20ALL=20[=20PRIVILEGES=20]=20}=0A=20=20=20=20=20TO=20= role_specification=20[,=20= ...]=20[=20WITH=20GRANT=20OPTION=20]=0A=20=20=20=20=20[=20GRANTED=20BY=20= role_specification=20]=0A= =20=0A+GRANT=20{=20SET=20VALUE=20|=20ALTER=20SYSTEM=20}=0A+=20=20=20=20= ON=20configuration_parameter=20[,=20...]=0A= +=20=20=20=20TO=20role_specification=20[,=20...]=20[=20= WITH=20GRANT=20OPTION=20]=0A+=20=20=20=20[=20GRANTED=20BY=20role_specification=20]=0A+=0A=20GRANT=20= role_name=20[,=20...]=20= TO=20role_specification=20= [,=20...]=0A=20=20=20=20=20[=20WITH=20ADMIN=20OPTION=20]=0A=20=20=20=20=20= [=20GRANTED=20BY=20role_specification=20]=0A@@=20-185,6=20= +190,8=20@@=20GRANT=20role_name=20[,=20...]=20TO=20TEMPORARY=0A=20=20=20=20= =20=20EXECUTE=0A=20=20=20=20=20=20= USAGE=0A+=20=20=20=20=20= SET=20VALUE=0A+=20=20=20=20=20= ALTER=20SYSTEM=0A=20=20=20=20=20=20= =0A=20=20=20=20=20=20=20=0A=20=20=20=20=20=20=20=20= Specific=20types=20of=20privileges,=20as=20defined=20in=20.=0Adiff=20--git=20a/doc/src/sgml/ref/set.sgml=20= b/doc/src/sgml/ref/set.sgml=0Aindex=20339ee9eec9..a08057d1d1=20100644=0A= ---=20a/doc/src/sgml/ref/set.sgml=0A+++=20b/doc/src/sgml/ref/set.sgml=0A= @@=20-34,8=20+34,9=20@@=20SET=20[=20SESSION=20|=20LOCAL=20]=20TIME=20= ZONE=20{=20timezone=20can=20be=20changed=20= on-the-fly=20with=0A=20=20=20=20SET.=0A-=20=20=20(But=20= some=20require=20superuser=20privileges=20to=20change,=20and=20others=20= cannot=0A-=20=20=20be=20changed=20after=20server=20or=20session=20= start.)=0A+=20=20=20(But=20some=20require=20either=20superuser=20= privileges=20or=20granted=20SET=0A+=20=20=20VALUE=20= privileges=20to=20change,=20and=20others=20cannot=20be=20changed=20after=0A= +=20=20=20server=20or=20session=20start.)=0A=20=20=20=20= SET=20only=20affects=20the=20value=20used=20by=20the=20= current=0A=20=20=20=20session.=0A=20=20=20=0Adiff=20--git=20= a/src/backend/catalog/Makefile=20b/src/backend/catalog/Makefile=0Aindex=20= 4e6efda97f..eb6d044da0=20100644=0A---=20a/src/backend/catalog/Makefile=0A= +++=20b/src/backend/catalog/Makefile=0A@@=20-28,6=20+28,7=20@@=20OBJS=20= =3D=20\=0A=20=09pg_cast.o=20\=0A=20=09pg_class.o=20\=0A=20=09= pg_collation.o=20\=0A+=09pg_config_param.o=20\=0A=20=09pg_constraint.o=20= \=0A=20=09pg_conversion.o=20\=0A=20=09pg_db_role_setting.o=20\=0A@@=20= -54,7=20+55,7=20@@=20include=20$(top_srcdir)/src/backend/common.mk=0A=20= #=20there=20are=20reputedly=20other,=20undocumented=20ordering=20= dependencies.=0A=20CATALOG_HEADERS=20:=3D=20\=0A=20=09pg_proc.h=20= pg_type.h=20pg_attribute.h=20pg_class.h=20\=0A-=09pg_attrdef.h=20= pg_constraint.h=20pg_inherits.h=20pg_index.h=20pg_operator.h=20\=0A+=09= pg_attrdef.h=20pg_config_param.h=20pg_constraint.h=20pg_inherits.h=20= pg_index.h=20pg_operator.h=20\=0A=20=09pg_opfamily.h=20pg_opclass.h=20= pg_am.h=20pg_amop.h=20pg_amproc.h=20\=0A=20=09pg_language.h=20= pg_largeobject_metadata.h=20pg_largeobject.h=20pg_aggregate.h=20\=0A=20=09= pg_statistic.h=20pg_statistic_ext.h=20pg_statistic_ext_data.h=20\=0A@@=20= -78,7=20+79,7=20@@=20POSTGRES_BKI_SRCS=20:=3D=20$(addprefix=20= $(top_srcdir)/src/include/catalog/,=20$(CATALOG_H=0A=20#=20The=20.dat=20= files=20we=20need=20can=20just=20be=20listed=20alphabetically.=0A=20= POSTGRES_BKI_DATA=20=3D=20$(addprefix=20= $(top_srcdir)/src/include/catalog/,\=0A=20=09pg_aggregate.dat=20= pg_am.dat=20pg_amop.dat=20pg_amproc.dat=20pg_authid.dat=20\=0A-=09= pg_cast.dat=20pg_class.dat=20pg_collation.dat=20pg_conversion.dat=20\=0A= +=09pg_cast.dat=20pg_class.dat=20pg_collation.dat=20pg_config_param.dat=20= pg_conversion.dat=20\=0A=20=09pg_database.dat=20pg_language.dat=20\=0A=20= =09pg_namespace.dat=20pg_opclass.dat=20pg_operator.dat=20pg_opfamily.dat=20= \=0A=20=09pg_proc.dat=20pg_range.dat=20pg_tablespace.dat=20\=0Adiff=20= --git=20a/src/backend/catalog/aclchk.c=20b/src/backend/catalog/aclchk.c=0A= index=20ce0a4ff14e..4ceb088034=20100644=0A---=20= a/src/backend/catalog/aclchk.c=0A+++=20b/src/backend/catalog/aclchk.c=0A= @@=20-33,6=20+33,7=20@@=0A=20#include=20"catalog/pg_authid.h"=0A=20= #include=20"catalog/pg_cast.h"=0A=20#include=20"catalog/pg_collation.h"=0A= +#include=20"catalog/pg_config_param.h"=0A=20#include=20= "catalog/pg_conversion.h"=0A=20#include=20"catalog/pg_database.h"=0A=20= #include=20"catalog/pg_default_acl.h"=0A@@=20-112,6=20+113,7=20@@=20= static=20void=20ExecGrant_Largeobject(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Namespace(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Tablespace(InternalGrant=20*grantStmt);=0A=20= static=20void=20ExecGrant_Type(InternalGrant=20*grantStmt);=0A+static=20= void=20ExecGrant_ConfigParam(InternalGrant=20*grantStmt);=0A=20=0A=20= static=20void=20SetDefaultACLsInSchemas(InternalDefaultACL=20*iacls,=20= List=20*nspnames);=0A=20static=20void=20SetDefaultACL(InternalDefaultACL=20= *iacls);=0A@@=20-259,6=20+261,9=20@@=20restrict_and_check_grant(bool=20= is_grant,=20AclMode=20avail_goptions,=20bool=20all_privs,=0A=20=09=09= case=20OBJECT_TYPE:=0A=20=09=09=09whole_mask=20=3D=20= ACL_ALL_RIGHTS_TYPE;=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09whole_mask=20=3D=20= ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09break;=0A=20=09=09default:=0A=20= =09=09=09elog(ERROR,=20"unrecognized=20object=20type:=20%d",=20objtype);=0A= =20=09=09=09/*=20not=20reached,=20but=20keep=20compiler=20quiet=20*/=0A= @@=20-498,6=20+503,10=20@@=20ExecuteGrantStmt(GrantStmt=20*stmt)=0A=20=09= =09=09all_privileges=20=3D=20ACL_ALL_RIGHTS_FOREIGN_SERVER;=0A=20=09=09=09= errormsg=20=3D=20gettext_noop("invalid=20privilege=20type=20%s=20for=20= foreign=20server");=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09all_privileges=20=3D=20= ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09errormsg=20=3D=20= gettext_noop("invalid=20privilege=20type=20%s=20for=20configuration=20= parameter");=0A+=09=09=09break;=0A=20=09=09default:=0A=20=09=09=09= elog(ERROR,=20"unrecognized=20GrantStmt.objtype:=20%d",=0A=20=09=09=09=09= =20(int)=20stmt->objtype);=0A@@=20-600,6=20+609,9=20@@=20= ExecGrantStmt_oids(InternalGrant=20*istmt)=0A=20=09=09case=20= OBJECT_TABLESPACE:=0A=20=09=09=09ExecGrant_Tablespace(istmt);=0A=20=09=09= =09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= ExecGrant_ConfigParam(istmt);=0A+=09=09=09break;=0A=20=09=09default:=0A=20= =09=09=09elog(ERROR,=20"unrecognized=20GrantStmt.objtype:=20%d",=0A=20=09= =09=09=09=20(int)=20istmt->objtype);=0A@@=20-759,6=20+771,15=20@@=20= objectNamesToOids(ObjectType=20objtype,=20List=20*objnames)=0A=20=09=09=09= =09objects=20=3D=20lappend_oid(objects,=20srvid);=0A=20=09=09=09}=0A=20=09= =09=09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= foreach(cell,=20objnames)=0A+=09=09=09{=0A+=09=09=09=09char=09=20=20=20= *cfgname=20=3D=20strVal(lfirst(cell));=0A+=09=09=09=09Oid=09=09=09cfgid=20= =3D=20get_cfgparam_oid(cfgname,=20false);=0A+=0A+=09=09=09=09objects=20=3D= =20lappend_oid(objects,=20cfgid);=0A+=09=09=09}=0A+=09=09=09break;=0A=20=09= =09default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20= GrantStmt.objtype:=20%d",=0A=20=09=09=09=09=20(int)=20objtype);=0A@@=20= -1007,6=20+1028,10=20@@=20ExecAlterDefaultPrivilegesStmt(ParseState=20= *pstate,=20AlterDefaultPrivilegesStmt=20*s=0A=20=09=09=09all_privileges=20= =3D=20ACL_ALL_RIGHTS_SCHEMA;=0A=20=09=09=09errormsg=20=3D=20= gettext_noop("invalid=20privilege=20type=20%s=20for=20schema");=0A=20=09=09= =09break;=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09= all_privileges=20=3D=20ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09errormsg=20= =3D=20gettext_noop("invalid=20privilege=20type=20%s=20for=20= configuration=20parameter");=0A+=09=09=09break;=0A=20=09=09default:=0A=20= =09=09=09elog(ERROR,=20"unrecognized=20GrantStmt.objtype:=20%d",=0A=20=09= =09=09=09=20(int)=20action->objtype);=0A@@=20-1204,6=20+1229,12=20@@=20= SetDefaultACL(InternalDefaultACL=20*iacls)=0A=20=09=09=09=09= this_privileges=20=3D=20ACL_ALL_RIGHTS_SCHEMA;=0A=20=09=09=09break;=0A=20= =0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09objtype=20=3D=20= DEFACLOBJ_CONFIG_PARAM;=0A+=09=09=09if=20(iacls->all_privs=20&&=20= this_privileges=20=3D=3D=20ACL_NO_RIGHTS)=0A+=09=09=09=09this_privileges=20= =3D=20ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=09=09=09break;=0A+=0A=20=09=09= default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20objtype:=20%d",=0A=20= =09=09=09=09=20(int)=20iacls->objtype);=0A@@=20-1437,6=20+1468,9=20@@=20= RemoveRoleFromObjectACL(Oid=20roleid,=20Oid=20classid,=20Oid=20objid)=0A=20= =09=09=09case=20DEFACLOBJ_NAMESPACE:=0A=20=09=09=09=09iacls.objtype=20=3D=20= OBJECT_SCHEMA;=0A=20=09=09=09=09break;=0A+=09=09=09case=20= DEFACLOBJ_CONFIG_PARAM:=0A+=09=09=09=09iacls.objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09break;=0A=20=09=09=09default:=0A=20=09= =09=09=09/*=20Shouldn't=20get=20here=20*/=0A=20=09=09=09=09elog(ERROR,=20= "unexpected=20default=20ACL=20type:=20%d",=0A@@=20-1494,6=20+1528,9=20@@=20= RemoveRoleFromObjectACL(Oid=20roleid,=20Oid=20classid,=20Oid=20objid)=0A=20= =09=09=09case=20ForeignDataWrapperRelationId:=0A=20=09=09=09=09= istmt.objtype=20=3D=20OBJECT_FDW;=0A=20=09=09=09=09break;=0A+=09=09=09= case=20ConfigParamRelationId:=0A+=09=09=09=09istmt.objtype=20=3D=20= OBJECT_CONFIG_PARAM;=0A+=09=09=09=09break;=0A=20=09=09=09default:=0A=20=09= =09=09=09elog(ERROR,=20"unexpected=20object=20class=20%u",=20classid);=0A= =20=09=09=09=09break;=0A@@=20-3225,6=20+3262,130=20@@=20= ExecGrant_Type(InternalGrant=20*istmt)=0A=20=09table_close(relation,=20= RowExclusiveLock);=0A=20}=0A=20=0A+static=20void=0A= +ExecGrant_ConfigParam(InternalGrant=20*istmt)=0A+{=0A+=09Relation=09= relation;=0A+=09ListCell=20=20=20*cell;=0A+=0A+=09if=20(istmt->all_privs=20= &&=20istmt->privileges=20=3D=3D=20ACL_NO_RIGHTS)=0A+=09=09= istmt->privileges=20=3D=20ACL_ALL_RIGHTS_CONFIG_PARAM;=0A+=0A+=09= relation=20=3D=20table_open(ConfigParamRelationId,=20RowExclusiveLock);=0A= +=0A+=09foreach(cell,=20istmt->objects)=0A+=09{=0A+=09=09Oid=09=09=09= cfgId=20=3D=20lfirst_oid(cell);=0A+=09=09Form_pg_config_param=20= pg_config_param_tuple;=0A+=09=09Datum=09=09aclDatum;=0A+=09=09bool=09=09= isNull;=0A+=09=09AclMode=09=09avail_goptions;=0A+=09=09AclMode=09=09= this_privileges;=0A+=09=09Acl=09=09=20=20=20*old_acl;=0A+=09=09Acl=09=09=20= =20=20*new_acl;=0A+=09=09Oid=09=09=09grantorId;=0A+=09=09Oid=09=09=09= ownerId;=0A+=09=09HeapTuple=09tuple;=0A+=09=09HeapTuple=09newtuple;=0A+=09= =09Datum=09=09values[Natts_pg_config_param];=0A+=09=09bool=09=09= nulls[Natts_pg_config_param];=0A+=09=09bool=09=09= replaces[Natts_pg_config_param];=0A+=09=09int=09=09=09noldmembers;=0A+=09= =09int=09=09=09nnewmembers;=0A+=09=09Oid=09=09=20=20=20*oldmembers;=0A+=09= =09Oid=09=09=20=20=20*newmembers;=0A+=0A+=09=09tuple=20=3D=20= SearchSysCache1(CONFIGOID,=20ObjectIdGetDatum(cfgId));=0A+=09=09if=20= (!HeapTupleIsValid(tuple))=0A+=09=09=09elog(ERROR,=20"cache=20lookup=20= failed=20for=20configuration=20parameter=20%u",=20cfgId);=0A+=0A+=09=09= pg_config_param_tuple=20=3D=20(Form_pg_config_param)=20GETSTRUCT(tuple);=0A= +=0A+=09=09/*=0A+=09=09=20*=20Get=20owner=20ID=20and=20working=20copy=20= of=20existing=20ACL.=20If=20there's=20no=20ACL,=0A+=09=09=20*=20= substitute=20the=20proper=20default.=0A+=09=09=20*/=0A+=09=09ownerId=20=3D= =20pg_config_param_tuple->configowner;=0A+=09=09aclDatum=20=3D=20= SysCacheGetAttr(CONFIGNAME,=20tuple,=20Anum_pg_config_param_cfgacl,=0A+=09= =09=09=09=09=09=09=09=20=20=20&isNull);=0A+=09=09if=20(isNull)=0A+=09=09= {=0A+=09=09=09old_acl=20=3D=20acldefault(OBJECT_CONFIG_PARAM,=20= ownerId);=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,=20ownerId,=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=20cfgId,=20grantorId,=20OBJECT_CONFIG_PARAM,=0A+=09=09=09=09= =09=09=09=09=09=20NameStr(pg_config_param_tuple->configname),=0A+=09=09=09= =09=09=09=09=09=09=200,=20NULL);=0A+=0A+=09=09/*=0A+=09=09=20*=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,=20ownerId);=0A+=0A+=09=09/*=0A+=09=09=20= *=20We=20need=20the=20members=20of=20both=20old=20and=20new=20ACLs=20so=20= we=20can=20correct=20the=0A+=09=09=20*=20shared=20dependency=20= information.=0A+=09=09=20*/=0A+=09=09nnewmembers=20=3D=20= aclmembers(new_acl,=20&newmembers);=0A+=0A+=09=09/*=20finished=20= building=20new=20ACL=20value,=20now=20insert=20it=20*/=0A+=09=09= MemSet(values,=200,=20sizeof(values));=0A+=09=09MemSet(nulls,=20false,=20= sizeof(nulls));=0A+=09=09MemSet(replaces,=20false,=20sizeof(replaces));=0A= +=0A+=09=09replaces[Anum_pg_config_param_cfgacl=20-=201]=20=3D=20true;=0A= +=09=09values[Anum_pg_config_param_cfgacl=20-=201]=20=3D=20= PointerGetDatum(new_acl);=0A+=0A+=09=09newtuple=20=3D=20= heap_modify_tuple(tuple,=20RelationGetDescr(relation),=20values,=0A+=09=09= =09=09=09=09=09=09=09=20nulls,=20replaces);=0A+=0A+=09=09= CatalogTupleUpdate(relation,=20&newtuple->t_self,=20newtuple);=0A+=0A+=09= =09/*=20Update=20initial=20privileges=20for=20extensions=20*/=0A+=09=09= recordExtensionInitPriv(cfgId,=20ConfigParamRelationId,=200,=20new_acl);=0A= +=0A+=09=09/*=20Update=20the=20shared=20dependency=20ACL=20info=20*/=0A+=09= =09updateAclDependencies(ConfigParamRelationId,=0A+=09=09=09=09=09=09=09=20= =20pg_config_param_tuple->oid,=200,=0A+=09=09=09=09=09=09=09=20=20= ownerId,=0A+=09=09=09=09=09=09=09=20=20noldmembers,=20oldmembers,=0A+=09=09= =09=09=09=09=09=20=20nnewmembers,=20newmembers);=0A+=0A+=09=09= ReleaseSysCache(tuple);=0A+=0A+=09=09pfree(new_acl);=0A+=0A+=09=09/*=20= prevent=20error=20when=20processing=20duplicate=20objects=20*/=0A+=09=09= CommandCounterIncrement();=0A+=09}=0A+=0A+=09table_close(relation,=20= RowExclusiveLock);=0A+}=0A+=0A=20=0A=20static=20AclMode=0A=20= string_to_privilege(const=20char=20*privname)=0A@@=20-3255,6=20+3416,10=20= @@=20string_to_privilege(const=20char=20*privname)=0A=20=09=09return=20= ACL_CREATE_TEMP;=0A=20=09if=20(strcmp(privname,=20"connect")=20=3D=3D=20= 0)=0A=20=09=09return=20ACL_CONNECT;=0A+=09if=20(strcmp(privname,=20= "set")=20=3D=3D=200)=0A+=09=09return=20ACL_SET;=0A+=09if=20= (strcmp(privname,=20"alter=20system")=20=3D=3D=200)=0A+=09=09return=20= ACL_ALTER_SYSTEM;=0A=20=09if=20(strcmp(privname,=20"rule")=20=3D=3D=200)=0A= =20=09=09return=200;=09=09=09=09/*=20ignore=20old=20RULE=20privileges=20= */=0A=20=09ereport(ERROR,=0A@@=20-3292,6=20+3457,10=20@@=20= privilege_to_string(AclMode=20privilege)=0A=20=09=09=09return=20"TEMP";=0A= =20=09=09case=20ACL_CONNECT:=0A=20=09=09=09return=20"CONNECT";=0A+=09=09= case=20ACL_SET:=0A+=09=09=09return=20"SET";=0A+=09=09case=20= ACL_ALTER_SYSTEM:=0A+=09=09=09return=20"ALTER=20SYSTEM";=0A=20=09=09= default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20privilege:=20%d",=20= (int)=20privilege);=0A=20=09}=0A@@=20-3328,6=20+3497,13=20@@=20= aclcheck_error(AclResult=20aclerr,=20ObjectType=20objtype,=0A=20=09=09=09= =09=09case=20OBJECT_COLUMN:=0A=20=09=09=09=09=09=09msg=20=3D=20= gettext_noop("permission=20denied=20for=20column=20%s");=0A=20=09=09=09=09= =09=09break;=0A+=09=09=09=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09=09= =09=09/*=0A+=09=09=09=09=09=09=20*=20Quote=20the=20object=20name=20for=20= backward=20compatibility=0A+=09=09=09=09=09=09=20*=20with=20behavior=20= before=20SET=20was=20handled=20here.=0A+=09=09=09=09=09=09=20*/=0A+=09=09= =09=09=09=09msg=20=3D=20gettext_noop("permission=20denied=20to=20set=20= parameter=20\"%s\"");=0A+=09=09=09=09=09=09break;=0A=20=09=09=09=09=09= case=20OBJECT_CONVERSION:=0A=20=09=09=09=09=09=09msg=20=3D=20= gettext_noop("permission=20denied=20for=20conversion=20%s");=0A=20=09=09=09= =09=09=09break;=0A@@=20-3457,6=20+3633,9=20@@=20aclcheck_error(AclResult=20= aclerr,=20ObjectType=20objtype,=0A=20=09=09=09=09=09case=20= OBJECT_COLLATION:=0A=20=09=09=09=09=09=09msg=20=3D=20gettext_noop("must=20= be=20owner=20of=20collation=20%s");=0A=20=09=09=09=09=09=09break;=0A+=09=09= =09=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09=09=09=09msg=20=3D=20= gettext_noop("must=20be=20owner=20of=20configuration=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=20gettext_noop("must=20be=20owner=20of=20= conversion=20%s");=0A=20=09=09=09=09=09=09break;=0A@@=20-4000,6=20= +4179,62=20@@=20pg_database_aclmask(Oid=20db_oid,=20Oid=20roleid,=0A=20=09= return=20result;=0A=20}=0A=20=0A+/*=0A+=20*=20Exported=20routine=20for=20= examining=20a=20user's=20privileges=20for=20a=20configuration=0A+=20*=20= parameter=20(GUC)=0A+=20*/=0A+AclMode=0A+pg_config_param_aclmask(Oid=20= config_oid,=20Oid=20roleid,=0A+=09=09=09=09=09=09AclMode=20mask,=20= AclMaskHow=20how)=0A+{=0A+=09AclMode=09=09result;=0A+=09HeapTuple=09= tuple;=0A+=09Datum=09=09aclDatum;=0A+=09bool=09=09isNull;=0A+=09Acl=09=09= =20=20=20*acl;=0A+=09Oid=09=09=09ownerId;=0A+=0A+=09/*=20Superusers=20= bypass=20all=20permission=20checking.=20*/=0A+=09if=20= (superuser_arg(roleid))=0A+=09=09return=20mask;=0A+=0A+=09/*=0A+=09=20*=20= Get=20the=20configuration=20parameter's=20ACL=20from=20pg_config_param=0A= +=09=20*/=0A+=09tuple=20=3D=20SearchSysCache1(CONFIGOID,=20= ObjectIdGetDatum(config_oid));=0A+=09if=20(!HeapTupleIsValid(tuple))=0A+=09= =09ereport(ERROR,=0A+=09=09=09=09(errcode(ERRCODE_UNDEFINED_DATABASE),=0A= +=09=09=09=09=20errmsg("configuration=20parameter=20with=20OID=20%u=20= does=20not=20exist",=0A+=09=09=09=09=09=09config_oid)));=0A+=0A+=09= ownerId=20=3D=20((Form_pg_config_param)=20= GETSTRUCT(tuple))->configowner;=0A+=0A+=09aclDatum=20=3D=20= SysCacheGetAttr(CONFIGOID,=20tuple,=20Anum_pg_config_param_cfgacl,=0A+=09= =09=09=09=09=09=09=20=20=20&isNull);=0A+=09if=20(isNull)=0A+=09{=0A+=09=09= /*=20No=20ACL,=20so=20build=20default=20ACL=20*/=0A+=09=09acl=20=3D=20= acldefault(OBJECT_CONFIG_PARAM,=20ownerId);=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,=20ownerId,=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+4948,18=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=20database=0A+=20*/=0A+AclResult=0A= +pg_config_param_aclcheck(Oid=20config_oid,=20Oid=20roleid,=20AclMode=20= mode)=0A+{=0A+=09if=20(pg_config_param_aclmask(config_oid,=20roleid,=20= mode,=20ACLMASK_ANY)=20!=3D=200)=0A+=09=09return=20ACLCHECK_OK;=0A+=09= else=0A+=09=09return=20ACLCHECK_NO_PRIV;=0A+}=0A+=0A=20/*=0A=20=20*=20= Exported=20routine=20for=20checking=20a=20user's=20access=20privileges=20= to=20a=20function=0A=20=20*/=0A@@=20-5283,6=20+5530,33=20@@=20= pg_collation_ownercheck(Oid=20coll_oid,=20Oid=20roleid)=0A=20=09return=20= has_privs_of_role(roleid,=20ownerId);=0A=20}=0A=20=0A+/*=0A+=20*=20= Ownership=20check=20for=20a=20collation=20(specified=20by=20OID).=0A+=20= */=0A+bool=0A+pg_config_param_ownercheck(Oid=20config_oid,=20Oid=20= roleid)=0A+{=0A+=09HeapTuple=09tuple;=0A+=09Oid=09=09=09ownerId;=0A+=0A+=09= /*=20Superusers=20bypass=20all=20permission=20checking.=20*/=0A+=09if=20= (superuser_arg(roleid))=0A+=09=09return=20true;=0A+=0A+=09tuple=20=3D=20= SearchSysCache1(CONFIGOID,=20ObjectIdGetDatum(config_oid));=0A+=09if=20= (!HeapTupleIsValid(tuple))=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_UNDEFINED_OBJECT),=0A+=09=09=09=09=20= errmsg("configuration=20parameter=20with=20OID=20%u=20does=20not=20= exist",=0A+=09=09=09=09=09=09config_oid)));=0A+=0A+=09ownerId=20=3D=20= ((Form_pg_config_param)=20GETSTRUCT(tuple))->configowner;=0A+=0A+=09= ReleaseSysCache(tuple);=0A+=0A+=09return=20has_privs_of_role(roleid,=20= ownerId);=0A+}=0A+=0A=20/*=0A=20=20*=20Ownership=20check=20for=20a=20= conversion=20(specified=20by=20OID).=0A=20=20*/=0Adiff=20--git=20= a/src/backend/catalog/catalog.c=20b/src/backend/catalog/catalog.c=0A= index=20aa7d4d5456..578bac485c=20100644=0A---=20= a/src/backend/catalog/catalog.c=0A+++=20b/src/backend/catalog/catalog.c=0A= @@=20-29,6=20+29,7=20@@=0A=20#include=20"catalog/namespace.h"=0A=20= #include=20"catalog/pg_auth_members.h"=0A=20#include=20= "catalog/pg_authid.h"=0A+#include=20"catalog/pg_config_param.h"=0A=20= #include=20"catalog/pg_database.h"=0A=20#include=20= "catalog/pg_db_role_setting.h"=0A=20#include=20= "catalog/pg_largeobject.h"=0A@@=20-246,6=20+247,7=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09/*=20These=20are=20the=20= shared=20catalogs=20(look=20for=20BKI_SHARED_RELATION)=20*/=0A=20=09if=20= (relationId=20=3D=3D=20AuthIdRelationId=20||=0A=20=09=09relationId=20=3D=3D= =20AuthMemRelationId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDescriptionRelationId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDependRelationId=20||=0A@@=20-260,6=20+262,8=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09=09relationId=20=3D=3D=20= AuthIdOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= AuthMemRoleMemIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= AuthMemMemRoleIndexId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamNameIndexId=20||=0A+=09=09relationId=20=3D=3D=20= ConfigParamOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseNameIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= DatabaseOidIndexId=20||=0A=20=09=09relationId=20=3D=3D=20= SharedDescriptionObjIndexId=20||=0A@@=20-277,6=20+281,8=20@@=20= IsSharedRelation(Oid=20relationId)=0A=20=09/*=20These=20are=20their=20= toast=20tables=20and=20toast=20indexes=20*/=0A=20=09if=20(relationId=20= =3D=3D=20PgAuthidToastTable=20||=0A=20=09=09relationId=20=3D=3D=20= PgAuthidToastIndex=20||=0A+=09=09relationId=20=3D=3D=20= PgConfigParamToastTable=20||=0A+=09=09relationId=20=3D=3D=20= PgConfigParamToastIndex=20||=0A=20=09=09relationId=20=3D=3D=20= PgDatabaseToastTable=20||=0A=20=09=09relationId=20=3D=3D=20= PgDatabaseToastIndex=20||=0A=20=09=09relationId=20=3D=3D=20= PgDbRoleSettingToastTable=20||=0Adiff=20--git=20= a/src/backend/catalog/dependency.c=20b/src/backend/catalog/dependency.c=0A= index=20fe9c714257..65cf4fbd0b=20100644=0A---=20= a/src/backend/catalog/dependency.c=0A+++=20= b/src/backend/catalog/dependency.c=0A@@=20-30,6=20+30,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-150,6=20+151,7=20@@=20static=20const=20= Oid=20object_classes[]=20=3D=20{=0A=20=09TypeRelationId,=09=09=09=09/*=20= OCLASS_TYPE=20*/=0A=20=09CastRelationId,=09=09=09=09/*=20OCLASS_CAST=20= */=0A=20=09CollationRelationId,=09=09/*=20OCLASS_COLLATION=20*/=0A+=09= ConfigParamRelationId,=09=09/*=20OCLASS_CONFIG_PARAM=20*/=0A=20=09= ConstraintRelationId,=09=09/*=20OCLASS_CONSTRAINT=20*/=0A=20=09= ConversionRelationId,=09=09/*=20OCLASS_CONVERSION=20*/=0A=20=09= AttrDefaultRelationId,=09=09/*=20OCLASS_DEFAULT=20*/=0A@@=20-1504,6=20= +1506,7=20@@=20doDeletion(const=20ObjectAddress=20*object,=20int=20= flags)=0A=20=09=09=09/*=0A=20=09=09=09=20*=20These=20global=20object=20= types=20are=20not=20supported=20here.=0A=20=09=09=09=20*/=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A=20=09=09case=20OCLASS_ROLE:=0A=20=09=09case=20= OCLASS_DATABASE:=0A=20=09=09case=20OCLASS_TBLSPACE:=0A@@=20-2778,6=20= +2781,9=20@@=20getObjectClass(const=20ObjectAddress=20*object)=0A=20=09=09= case=20CollationRelationId:=0A=20=09=09=09return=20OCLASS_COLLATION;=0A=20= =0A+=09=09case=20ConfigParamRelationId:=0A+=09=09=09return=20= OCLASS_CONFIG_PARAM;=0A+=0A=20=09=09case=20ConstraintRelationId:=0A=20=09= =09=09return=20OCLASS_CONSTRAINT;=0A=20=0Adiff=20--git=20= a/src/backend/catalog/objectaddress.c=20= b/src/backend/catalog/objectaddress.c=0Aindex=202bae3fbb17..a4d4f3b3c7=20= 100644=0A---=20a/src/backend/catalog/objectaddress.c=0A+++=20= b/src/backend/catalog/objectaddress.c=0A@@=20-29,6=20+29,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-2309,6=20+2310,7=20@@=20= pg_get_object_address(PG_FUNCTION_ARGS)=0A=20=09=09case=20OBJECT_COLUMN:=0A= =20=09=09case=20OBJECT_ATTRIBUTE:=0A=20=09=09case=20OBJECT_COLLATION:=0A= +=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09=09case=20OBJECT_CONVERSION:=0A= =20=09=09case=20OBJECT_STATISTIC_EXT:=0A=20=09=09case=20OBJECT_TSPARSER:=0A= @@=20-2496,6=20+2498,11=20@@=20check_object_ownership(Oid=20roleid,=20= ObjectType=20objtype,=20ObjectAddress=20address,=0A=20=09=09=09=09= aclcheck_error(ACLCHECK_NOT_OWNER,=20objtype,=0A=20=09=09=09=09=09=09=09=20= =20=20NameListToString(castNode(List,=20object)));=0A=20=09=09=09break;=0A= +=09=09case=20OBJECT_CONFIG_PARAM:=0A+=09=09=09if=20= (!pg_config_param_ownercheck(address.objectId,=20roleid))=0A+=09=09=09=09= aclcheck_error(ACLCHECK_NOT_OWNER,=20objtype,=0A+=09=09=09=09=09=09=09=20= =20=20NameListToString(castNode(List,=20object)));=0A+=09=09=09break;=0A=20= =09=09case=20OBJECT_CONVERSION:=0A=20=09=09=09if=20= (!pg_conversion_ownercheck(address.objectId,=20roleid))=0A=20=09=09=09=09= aclcheck_error(ACLCHECK_NOT_OWNER,=20objtype,=0A@@=20-3510,6=20+3517,22=20= @@=20getObjectDescription(const=20ObjectAddress=20*object,=20bool=20= missing_ok)=0A=20=09=09=09=09break;=0A=20=09=09=09}=0A=20=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A+=09=09=09{=0A+=09=09=09=09char=09=20=20=20= *configname;=0A+=0A+=09=09=09=09configname=20=3D=20= get_cfgparam_name(object->objectId);=0A+=09=09=09=09if=20(!configname)=0A= +=09=09=09=09{=0A+=09=09=09=09=09if=20(!missing_ok)=0A+=09=09=09=09=09=09= elog(ERROR,=20"cache=20lookup=20failed=20for=20configuration=20parameter=20= %u",=0A+=09=09=09=09=09=09=09=20object->objectId);=0A+=09=09=09=09=09= break;=0A+=09=09=09=09}=0A+=09=09=09=09appendStringInfo(&buffer,=20= _("configuration=20parameter=20%s"),=20configname);=0A+=09=09=09=09= break;=0A+=09=09=09}=0A+=0A=20=09=09case=20OCLASS_SCHEMA:=0A=20=09=09=09= {=0A=20=09=09=09=09char=09=20=20=20*nspname;=0A@@=20-4473,6=20+4496,10=20= @@=20getObjectTypeDescription(const=20ObjectAddress=20*object,=20bool=20= missing_ok)=0A=20=09=09=09appendStringInfoString(&buffer,=20= "collation");=0A=20=09=09=09break;=0A=20=0A+=09=09case=20= OCLASS_CONFIG_PARAM:=0A+=09=09=09appendStringInfoString(&buffer,=20= "configuration=20parameter");=0A+=09=09=09break;=0A+=0A=20=09=09case=20= OCLASS_CONSTRAINT:=0A=20=09=09=09getConstraintTypeDescription(&buffer,=20= object->objectId,=0A=20=09=09=09=09=09=09=09=09=09=09=20missing_ok);=0A= @@=20-4977,6=20+5004,28=20@@=20getObjectIdentityParts(const=20= ObjectAddress=20*object,=0A=20=09=09=09=09break;=0A=20=09=09=09}=0A=20=0A= +=09=09case=20OCLASS_CONFIG_PARAM:=0A+=09=09=09{=0A+=09=09=09=09= HeapTuple=09configTup;=0A+=09=09=09=09Form_pg_config_param=20configForm;=0A= +=0A+=09=09=09=09configTup=20=3D=20SearchSysCache1(CONFIGOID,=0A+=09=09=09= =09=09=09=09=09=09=09=09ObjectIdGetDatum(object->objectId));=0A+=09=09=09= =09if=20(!HeapTupleIsValid(configTup))=0A+=09=09=09=09{=0A+=09=09=09=09=09= if=20(!missing_ok)=0A+=09=09=09=09=09=09elog(ERROR,=20"cache=20lookup=20= failed=20for=20configuration=20parameter=20%u",=0A+=09=09=09=09=09=09=09=20= object->objectId);=0A+=09=09=09=09=09break;=0A+=09=09=09=09}=0A+=09=09=09= =09configForm=20=3D=20(Form_pg_config_param)=20GETSTRUCT(configTup);=0A+=09= =09=09=09appendStringInfoString(&buffer,=20= NameStr(configForm->configname));=0A+=09=09=09=09if=20(objname)=0A+=09=09= =09=09=09*objname=20=3D=20= list_make1(pstrdup(NameStr(configForm->configname)));=0A+=09=09=09=09= ReleaseSysCache(configTup);=0A+=09=09=09=09break;=0A+=09=09=09}=0A+=0A=20= =09=09case=20OCLASS_CONVERSION:=0A=20=09=09=09{=0A=20=09=09=09=09= HeapTuple=09conTup;=0Adiff=20--git=20= a/src/backend/catalog/pg_config_param.c=20= b/src/backend/catalog/pg_config_param.c=0Anew=20file=20mode=20100644=0A= index=200000000000..9589f1aa41=0A---=20/dev/null=0A+++=20= b/src/backend/catalog/pg_config_param.c=0A@@=20-0,0=20+1,143=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_config_param.c=0A+=20*=09=20=20routines=20to=20= support=20manipulation=20of=20the=20pg_config_param=20relation=0A+=20*=0A= +=20*=20Portions=20Copyright=20(c)=201996-2021,=20PostgreSQL=20Global=20= Development=20Group=0A+=20*=20Portions=20Copyright=20(c)=201994,=20= Regents=20of=20the=20University=20of=20California=0A+=20*=0A+=20*=0A+=20= *=20IDENTIFICATION=0A+=20*=09=20=20src/backend/catalog/pg_config_param.c=0A= +=20*=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#include=20"postgres.h"=0A+=0A+#include=20"access/genam.h"=0A= +#include=20"access/heapam.h"=0A+#include=20"access/htup_details.h"=0A= +#include=20"access/sysattr.h"=0A+#include=20"access/table.h"=0A= +#include=20"access/tableam.h"=0A+#include=20"catalog/catalog.h"=0A= +#include=20"catalog/dependency.h"=0A+#include=20"catalog/indexing.h"=0A= +#include=20"catalog/objectaccess.h"=0A+#include=20= "catalog/pg_config_param.h"=0A+#include=20"catalog/pg_namespace.h"=0A= +#include=20"mb/pg_wchar.h"=0A+#include=20"utils/builtins.h"=0A+#include=20= "utils/fmgroids.h"=0A+#include=20"utils/pg_locale.h"=0A+#include=20= "utils/rel.h"=0A+#include=20"utils/syscache.h"=0A+=0A+=0A+/*=0A+=20*=20= ConfigParamCreate=0A+=20*=0A+=20*=20Add=20a=20new=20tuple=20to=20= pg_config_param.=20=20It=20is=20the=20caller's=20responsibility=20to=0A+=20= *=20check=20that=20a=20GUC=20variable=20of=20the=20given=20name=20= exists,=20that=20the=20name=20is=20the=0A+=20*=20canonical=20name=20of=20= the=20variable=20rather=20than=20an=20alias,=20and=20that=20the=20name=20= will=0A+=20*=20fit=20within=20a=20NameData.=20=20(Passing=20an=20alias=20= and=20if_not_exists=20will=20work=20to=0A+=20*=20look=20up=20the=20Oid,=20= but=20callers=20should=20not=20rely=20on=20that,=20as=20the=20alias=20= could=0A+=20*=20accidentally=20be=20inserted.)=0A+=20*=0A+=20*=20= configname:=20the=20configuration=20parameter=20name=20to=20create.=0A+=20= *=20configowner:=20oid=20of=20role=20which=20will=20own=20this=20= configuration=20parameter.=0A+=20*=20if_not_exists:=20if=20true,=20don't=20= fail=20on=20duplicate=20name,=20but=20rather=20return=0A+=20*=20the=20= existing=20entry's=20Oid.=0A+=20*/=0A+Oid=0A+ConfigParamCreate(const=20= char=20*configname,=0A+=09=09=09=09=20=20Oid=20configowner,=0A+=09=09=09=09= =20=20bool=20if_not_exists)=0A+{=0A+=09Relation=09rel;=0A+=09TupleDesc=09= tupDesc;=0A+=09HeapTuple=09tuple;=0A+=09Datum=09=09= values[Natts_pg_config_param];=0A+=09bool=09=09= nulls[Natts_pg_config_param];=0A+=09Oid=09=09=09configParamId;=0A+=0A+=09= /*=0A+=09=20*=20Check=20whether=20the=20configuration=20parameter=20(by=20= the=20given=20name=20or=20alias)=0A+=09=20*=20already=20exists.=0A+=09=20= */=0A+=09configParamId=20=3D=20get_cfgparam_oid(configname,=20true);=0A+=09= if=20(OidIsValid(configParamId))=0A+=09{=0A+=09=09if=20(if_not_exists)=0A= +=09=09=09return=20configParamId;=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_DUPLICATE_OBJECT),=0A+=09=09=09=09=20= errmsg("configuration=20parameter=20\"%s\"=20already=20exists",=0A+=09=09= =09=09=09=09configname)));=0A+=09}=0A+=0A+=09/*=0A+=09=20*=20Create=20= and=20insert=20a=20new=20record,=20starting=20with=20a=20blank=20Acl.=0A= +=09=20*=0A+=09=20*=20We=20don't=20take=20a=20strong=20enough=20lock=20= to=20prevent=20concurrent=20insertions,=0A+=09=20*=20relying=20instead=20= on=20the=20unique=20index.=0A+=09=20*/=0A+=09rel=20=3D=20= table_open(ConfigParamRelationId,=20RowExclusiveLock);=0A+=09tupDesc=20=3D= =20RelationGetDescr(rel);=0A+=09MemSet(values,=200,=20sizeof(values));=0A= +=09MemSet(nulls,=20false,=20sizeof(nulls));=0A+=09= values[Anum_pg_config_param_configname=20-=201]=20=3D=0A+=09=09= DirectFunctionCall1(namein,=20CStringGetDatum(configname));=0A+=09= configParamId=20=3D=20GetNewOidWithIndex(rel,=0A+=09=09=09=09=09=09=09=09= =09=20=20=20ConfigParamOidIndexId,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= Anum_pg_config_param_oid);=0A+=09values[Anum_pg_config_param_oid=20-=20= 1]=20=3D=20ObjectIdGetDatum(configParamId);=0A+=09= values[Anum_pg_config_param_configowner=20-=201]=20=3D=20= ObjectIdGetDatum(configowner);=0A+=09nulls[Anum_pg_config_param_cfgacl=20= -=201]=20=3D=20true;=0A+=09tuple=20=3D=20heap_form_tuple(tupDesc,=20= values,=20nulls);=0A+=09CatalogTupleInsert(rel,=20tuple);=0A+=0A+=09/*=20= Post=20creation=20hook=20for=20new=20configuration=20parameter=20*/=0A+=09= InvokeObjectPostCreateHook(ConfigParamRelationId,=20configParamId,=200);=0A= +=0A+=09/*=0A+=09=20*=20Close=20pg_config_param,=20but=20keep=20lock=20= till=20commit.=0A+=09=20*/=0A+=09heap_freetuple(tuple);=0A+=09= table_close(rel,=20NoLock);=0A+=0A+=09return=20configParamId;=0A+}=0A+=0A= +void=0A+ConfigParamDrop(const=20char=20*configname,=20bool=20= missing_ok)=0A+{=0A+=09Oid=09=09=09configParamId;=0A+=09Relation=09rel;=0A= +=09TableScanDesc=20scan;=0A+=09ScanKeyData=20keys[1];=0A+=09HeapTuple=09= tup;=0A+=09int=09=09=09numkeys=20=3D=200;=0A+=0A+=09configParamId=20=3D=20= get_cfgparam_oid(configname,=20missing_ok);=0A+=09if=20= (!OidIsValid(configParamId))=0A+=09=09return;=0A+=0A+=09rel=20=3D=20= table_open(ConfigParamRelationId,=20RowExclusiveLock);=0A+=0A+=09= ScanKeyInit(&keys[numkeys],=0A+=09=09=09=09Anum_pg_config_param_oid,=0A+=09= =09=09=09BTEqualStrategyNumber,=0A+=09=09=09=09F_OIDEQ,=0A+=09=09=09=09= ObjectIdGetDatum(configParamId));=0A+=09numkeys++;=0A+=0A+=09scan=20=3D=20= table_beginscan_catalog(rel,=20numkeys,=20keys);=0A+=09while=20= (HeapTupleIsValid(tup=20=3D=20heap_getnext(scan,=20= ForwardScanDirection)))=0A+=09{=0A+=09=09CatalogTupleDelete(rel,=20= &tup->t_self);=0A+=09}=0A+=09table_endscan(scan);=0A+=0A+=09= table_close(rel,=20RowExclusiveLock);=0A+}=0Adiff=20--git=20= a/src/backend/commands/Makefile=20b/src/backend/commands/Makefile=0A= index=20e8504f0ae4..3f41ecc4fc=20100644=0A---=20= a/src/backend/commands/Makefile=0A+++=20b/src/backend/commands/Makefile=0A= @@=20-21,6=20+21,7=20@@=20OBJS=20=3D=20\=0A=20=09cluster.o=20\=0A=20=09= collationcmds.o=20\=0A=20=09comment.o=20\=0A+=09configcmds.o=20\=0A=20=09= constraint.o=20\=0A=20=09conversioncmds.o=20\=0A=20=09copy.o=20\=0Adiff=20= --git=20a/src/backend/commands/alter.c=20b/src/backend/commands/alter.c=0A= index=2040044070cf..1f8c3f78c2=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_CONFIG_PARAM:=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/configcmds.c=20= b/src/backend/commands/configcmds.c=0Anew=20file=20mode=20100644=0Aindex=20= 0000000000..ae9e4c75fc=0A---=20/dev/null=0A+++=20= b/src/backend/commands/configcmds.c=0A@@=20-0,0=20+1,80=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20configcmds.c=0A+=20*=09=20=20Commands=20for=20= manipulating=20configuration=20parameters.=0A+=20*=0A+=20*=20Portions=20= Copyright=20(c)=201996-2021,=20PostgreSQL=20Global=20Development=20Group=0A= +=20*=20Portions=20Copyright=20(c)=201994,=20Regents=20of=20the=20= University=20of=20California=0A+=20*=0A+=20*=20= src/backend/commands/configcmds.c=0A+=20*=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#include=20"postgres.h"=0A+=0A+#include=20"access/genam.h"=0A= +#include=20"access/htup_details.h"=0A+#include=20"access/table.h"=0A= +#include=20"access/xact.h"=0A+#include=20"catalog/binary_upgrade.h"=0A= +#include=20"catalog/catalog.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_auth_members.h"=0A+#include=20"catalog/pg_authid.h"=0A= +#include=20"catalog/pg_config_param.h"=0A+#include=20= "catalog/pg_database.h"=0A+#include=20"commands/comment.h"=0A+#include=20= "commands/dbcommands.h"=0A+#include=20"commands/defrem.h"=0A+#include=20= "commands/seclabel.h"=0A+#include=20"commands/configcmds.h"=0A+#include=20= "libpq/crypt.h"=0A+#include=20"miscadmin.h"=0A+#include=20= "storage/lmgr.h"=0A+#include=20"utils/acl.h"=0A+#include=20= "utils/builtins.h"=0A+#include=20"utils/fmgroids.h"=0A+#include=20= "utils/syscache.h"=0A+#include=20"utils/timestamp.h"=0A+=0A+/*=0A+=20*=20= CREATE=20CONFIGURATION=20PARAMETER=0A+=20*/=0A+Oid=0A= +CreateConfigParam(CreateConfigParamStmt=20*stmt)=0A+{=0A+=09/*=0A+=09=20= *=20Check=20some=20permissions=20first.=0A+=09=20*=0A+=09=20*=20There=20= are=20currently=20no=20callers=20except=20extensions=20which=20register=20= their=0A+=09=20*=20custom=20variables.=0A+=09=20*/=0A+=09if=20= (!superuser())=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=20errmsg("must=20= be=20superuser=20to=20create=20configuration=20parameters")));=0A+=0A+=09= /*=0A+=09=20*=20For=20now=20the=20owner=20cannot=20be=20specified=20on=20= create.=20This=20command=20is=20only=0A+=09=20*=20useful=20for=20= extension=20authors.=0A+=09=20*/=0A+=09return=20= ConfigParamCreate(stmt->cfgparam_name,=20BOOTSTRAP_SUPERUSERID,=0A+=09=09= =09=09=09=09=09=20stmt->if_not_exists);=0A+}=0A+=0A+/*=0A+=20*=20DROP=20= CONFIGURATION=20PARAMETER=0A+=20*/=0A+void=0A= +DropConfigParam(DropConfigParamStmt=20*stmt)=0A+{=0A+=09if=20= (!superuser())=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=20errmsg("must=20= be=20superuser=20to=20drop=20configuration=20parameter")));=0A+=0A+=09= ConfigParamDrop(stmt->cfgparam_name,=20stmt->missing_ok);=0A+}=0Adiff=20= --git=20a/src/backend/commands/dropcmds.c=20= b/src/backend/commands/dropcmds.c=0Aindex=204e545adf95..cd98976e07=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_CONFIG_PARAM:=0A+=09=09=09= if=20(!schema_does_not_exist_skipping(castNode(List,=20object),=20&msg,=20= &name))=0A+=09=09=09{=0A+=09=09=09=09msg=20=3D=20= gettext_noop("configuration=20parameter=20\"%s\"=20does=20not=20exist,=20= skipping");=0A+=09=09=09=09name=20=3D=20NameListToString(castNode(List,=20= object));=0A+=09=09=09}=0A+=09=09=09break;=0A=20=09=09case=20= OBJECT_CONVERSION:=0A=20=09=09=09if=20= (!schema_does_not_exist_skipping(castNode(List,=20object),=20&msg,=20= &name))=0A=20=09=09=09{=0Adiff=20--git=20= a/src/backend/commands/event_trigger.c=20= b/src/backend/commands/event_trigger.c=0Aindex=20df264329d8..419a7a4fad=20= 100644=0A---=20a/src/backend/commands/event_trigger.c=0A+++=20= b/src/backend/commands/event_trigger.c=0A@@=20-937,6=20+937,7=20@@=20= EventTriggerSupportsObjectType(ObjectType=20obtype)=0A=20{=0A=20=09= switch=20(obtype)=0A=20=09{=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09= =09case=20OBJECT_DATABASE:=0A=20=09=09case=20OBJECT_TABLESPACE:=0A=20=09=09= case=20OBJECT_ROLE:=0A@@=20-1012,6=20+1013,7=20@@=20= EventTriggerSupportsObjectClass(ObjectClass=20objclass)=0A=20{=0A=20=09= switch=20(objclass)=0A=20=09{=0A+=09=09case=20OCLASS_CONFIG_PARAM:=0A=20=09= =09case=20OCLASS_DATABASE:=0A=20=09=09case=20OCLASS_TBLSPACE:=0A=20=09=09= case=20OCLASS_ROLE:=0A@@=20-2078,6=20+2080,8=20@@=20= stringify_grant_objtype(ObjectType=20objtype)=0A=20=09{=0A=20=09=09case=20= OBJECT_COLUMN:=0A=20=09=09=09return=20"COLUMN";=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09return=20"CONFIGURATION=20PARAMETER";=0A= =20=09=09case=20OBJECT_TABLE:=0A=20=09=09=09return=20"TABLE";=0A=20=09=09= case=20OBJECT_SEQUENCE:=0A@@=20-2161,6=20+2165,8=20@@=20= stringify_adefprivs_objtype(ObjectType=20objtype)=0A=20=09{=0A=20=09=09= case=20OBJECT_COLUMN:=0A=20=09=09=09return=20"COLUMNS";=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09return=20"CONFIGURATION=20PARAMETERS";=0A= =20=09=09case=20OBJECT_TABLE:=0A=20=09=09=09return=20"TABLES";=0A=20=09=09= case=20OBJECT_SEQUENCE:=0Adiff=20--git=20= a/src/backend/commands/seclabel.c=20b/src/backend/commands/seclabel.c=0A= index=2053c18628a7..6a0fe325cf=20100644=0A---=20= a/src/backend/commands/seclabel.c=0A+++=20= b/src/backend/commands/seclabel.c=0A@@=20-67,6=20+67,7=20@@=20= SecLabelSupportsObjectType(ObjectType=20objtype)=0A=20=09=09case=20= OBJECT_ATTRIBUTE:=0A=20=09=09case=20OBJECT_CAST:=0A=20=09=09case=20= OBJECT_COLLATION:=0A+=09=09case=20OBJECT_CONFIG_PARAM:=0A=20=09=09case=20= OBJECT_CONVERSION:=0A=20=09=09case=20OBJECT_DEFAULT:=0A=20=09=09case=20= OBJECT_DEFACL:=0Adiff=20--git=20a/src/backend/commands/tablecmds.c=20= b/src/backend/commands/tablecmds.c=0Aindex=20857cc5ce6e..7b6c93d8a1=20= 100644=0A---=20a/src/backend/commands/tablecmds.c=0A+++=20= b/src/backend/commands/tablecmds.c=0A@@=20-12262,6=20+12262,7=20@@=20= ATExecAlterColumnType(AlteredTableInfo=20*tab,=20Relation=20rel,=0A=20=09= =09=09case=20OCLASS_TYPE:=0A=20=09=09=09case=20OCLASS_CAST:=0A=20=09=09=09= case=20OCLASS_COLLATION:=0A+=09=09=09case=20OCLASS_CONFIG_PARAM:=0A=20=09= =09=09case=20OCLASS_CONVERSION:=0A=20=09=09=09case=20OCLASS_LANGUAGE:=0A=20= =09=09=09case=20OCLASS_LARGEOBJECT:=0Adiff=20--git=20= a/src/backend/nodes/copyfuncs.c=20b/src/backend/nodes/copyfuncs.c=0A= index=20ad1ea2ff2f..3a53a4c14d=20100644=0A---=20= a/src/backend/nodes/copyfuncs.c=0A+++=20b/src/backend/nodes/copyfuncs.c=0A= @@=20-4604,6=20+4604,28=20@@=20_copyCreateSchemaStmt(const=20= CreateSchemaStmt=20*from)=0A=20=09return=20newnode;=0A=20}=0A=20=0A= +static=20CreateConfigParamStmt=20*=0A+_copyCreateConfigParamStmt(const=20= CreateConfigParamStmt=20*from)=0A+{=0A+=09CreateConfigParamStmt=20= *newnode=20=3D=20makeNode(CreateConfigParamStmt);=0A+=0A+=09= COPY_NODE_FIELD(cfgparam_name);=0A+=09COPY_SCALAR_FIELD(if_not_exists);=0A= +=0A+=09return=20newnode;=0A+}=0A+=0A+static=20DropConfigParamStmt=20*=0A= +_copyDropConfigParamStmt(const=20DropConfigParamStmt=20*from)=0A+{=0A+=09= DropConfigParamStmt=20*newnode=20=3D=20makeNode(DropConfigParamStmt);=0A= +=0A+=09COPY_NODE_FIELD(cfgparam_name);=0A+=09= COPY_SCALAR_FIELD(missing_ok);=0A+=0A+=09return=20newnode;=0A+}=0A+=0A=20= static=20CreateConversionStmt=20*=0A=20_copyCreateConversionStmt(const=20= CreateConversionStmt=20*from)=0A=20{=0A@@=20-5700,6=20+5722,12=20@@=20= copyObjectImpl(const=20void=20*from)=0A=20=09=09case=20= T_CreateSchemaStmt:=0A=20=09=09=09retval=20=3D=20= _copyCreateSchemaStmt(from);=0A=20=09=09=09break;=0A+=09=09case=20= T_CreateConfigParamStmt:=0A+=09=09=09retval=20=3D=20= _copyCreateConfigParamStmt(from);=0A+=09=09=09break;=0A+=09=09case=20= T_DropConfigParamStmt:=0A+=09=09=09retval=20=3D=20= _copyDropConfigParamStmt(from);=0A+=09=09=09break;=0A=20=09=09case=20= T_CreateConversionStmt:=0A=20=09=09=09retval=20=3D=20= _copyCreateConversionStmt(from);=0A=20=09=09=09break;=0Adiff=20--git=20= a/src/backend/nodes/equalfuncs.c=20b/src/backend/nodes/equalfuncs.c=0A= index=20f537d3eb96..37ff9b2c9e=20100644=0A---=20= a/src/backend/nodes/equalfuncs.c=0A+++=20= b/src/backend/nodes/equalfuncs.c=0A@@=20-2203,6=20+2203,24=20@@=20= _equalCreateSchemaStmt(const=20CreateSchemaStmt=20*a,=20const=20= CreateSchemaStmt=20*b)=0A=20=09return=20true;=0A=20}=0A=20=0A+static=20= bool=0A+_equalCreateConfigParamStmt(const=20CreateConfigParamStmt=20*a,=20= const=20CreateConfigParamStmt=20*b)=0A+{=0A+=09= COMPARE_NODE_FIELD(cfgparam_name);=0A+=09= COMPARE_SCALAR_FIELD(if_not_exists);=0A+=0A+=09return=20true;=0A+}=0A+=0A= +static=20bool=0A+_equalDropConfigParamStmt(const=20DropConfigParamStmt=20= *a,=20const=20DropConfigParamStmt=20*b)=0A+{=0A+=09= COMPARE_NODE_FIELD(cfgparam_name);=0A+=09= COMPARE_SCALAR_FIELD(missing_ok);=0A+=0A+=09return=20true;=0A+}=0A+=0A=20= static=20bool=0A=20_equalCreateConversionStmt(const=20= CreateConversionStmt=20*a,=20const=20CreateConversionStmt=20*b)=0A=20{=0A= @@=20-3705,6=20+3723,12=20@@=20equal(const=20void=20*a,=20const=20void=20= *b)=0A=20=09=09case=20T_CreateSchemaStmt:=0A=20=09=09=09retval=20=3D=20= _equalCreateSchemaStmt(a,=20b);=0A=20=09=09=09break;=0A+=09=09case=20= T_CreateConfigParamStmt:=0A+=09=09=09retval=20=3D=20= _equalCreateConfigParamStmt(a,=20b);=0A+=09=09=09break;=0A+=09=09case=20= T_DropConfigParamStmt:=0A+=09=09=09retval=20=3D=20= _equalDropConfigParamStmt(a,=20b);=0A+=09=09=09break;=0A=20=09=09case=20= T_CreateConversionStmt:=0A=20=09=09=09retval=20=3D=20= _equalCreateConversionStmt(a,=20b);=0A=20=09=09=09break;=0Adiff=20--git=20= a/src/backend/parser/gram.y=20b/src/backend/parser/gram.y=0Aindex=20= a6d0cefa6b..e22e4a9959=20100644=0A---=20a/src/backend/parser/gram.y=0A= +++=20b/src/backend/parser/gram.y=0A@@=20-299,7=20+299,7=20@@=20static=20= Node=20*makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20= Node=20*query);=0A=20=09=09SecLabelStmt=20SelectStmt=20TransactionStmt=20= TransactionStmtLegacy=20TruncateStmt=0A=20=09=09UnlistenStmt=20= UpdateStmt=20VacuumStmt=0A=20=09=09VariableResetStmt=20VariableSetStmt=20= VariableShowStmt=0A-=09=09ViewStmt=20CheckPointStmt=20= CreateConversionStmt=0A+=09=09ViewStmt=20CheckPointStmt=20= CreateConfigParamStmt=20DropConfigParamStmt=20CreateConversionStmt=0A=20=09= =09DeallocateStmt=20PrepareStmt=20ExecuteStmt=0A=20=09=09DropOwnedStmt=20= ReassignOwnedStmt=0A=20=09=09AlterTSConfigurationStmt=20= AlterTSDictionaryStmt=0A@@=20-348,8=20+348,8=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20%type=20=09=09foreign_server_version=20= opt_foreign_server_version=0A=20%type=20=09=09opt_in_database=0A=20=0A= -%type=20=09=09OptSchemaName=0A-%type=20=09OptSchemaEltList=0A= +%type=20=09=09OptSchemaName=20cfgparam_name=0A+%type=20=09= OptSchemaEltList=20cfgparam_target=0A=20=0A=20%type=20=09=09am_type=0A= =20=0A@@=20-387,8=20+387,8=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20%type=20=09=09iso_level=20opt_encoding=0A=20%type=20= =20grantee=0A=20%type=20=09grantee_list=0A-%type=20= =20privilege=0A-%type=20=09privileges=20privilege_list=0A= +%type=20=20privilege=20guc_priv=0A+%type=20=09= privileges=20privilege_list=20guc_priv_list=0A=20%type=20=20= privilege_target=0A=20%type=20=20function_with_argtypes=20= aggregate_with_argtypes=20operator_with_argtypes=0A=20%type=20=09= function_with_argtypes_list=20aggregate_with_argtypes_list=20= operator_with_argtypes_list=0A@@=20-698,7=20+698,7=20@@=20static=20Node=20= *makeRecursiveViewSelect(char=20*relname,=20List=20*aliases,=20Node=20= *query);=0A=20=09ORDER=20ORDINALITY=20OTHERS=20OUT_P=20OUTER_P=0A=20=09= OVER=20OVERLAPS=20OVERLAY=20OVERRIDING=20OWNED=20OWNER=0A=20=0A-=09= PARALLEL=20PARSER=20PARTIAL=20PARTITION=20PASSING=20PASSWORD=20PLACING=20= PLANS=20POLICY=0A+=09PARALLEL=20PARAMETER=20PARSER=20PARTIAL=20PARTITION=20= PASSING=20PASSWORD=20PLACING=20PLANS=20POLICY=0A=20=09POSITION=20= PRECEDING=20PRECISION=20PRESERVE=20PREPARE=20PREPARED=20PRIMARY=0A=20=09= PRIOR=20PRIVILEGES=20PROCEDURAL=20PROCEDURE=20PROCEDURES=20PROGRAM=20= PUBLICATION=0A=20=0A@@=20-951,6=20+951,8=20@@=20stmt:=0A=20=09=09=09|=20= CreateAsStmt=0A=20=09=09=09|=20CreateAssertionStmt=0A=20=09=09=09|=20= CreateCastStmt=0A+=09=09=09|=20CreateConfigParamStmt=0A+=09=09=09|=20= DropConfigParamStmt=0A=20=09=09=09|=20CreateConversionStmt=0A=20=09=09=09= |=20CreateDomainStmt=0A=20=09=09=09|=20CreateExtensionStmt=0A@@=20= -6884,6=20+6886,31=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=20guc_priv_list=20ON=20cfgparam_target=20TO=20grantee_list=0A= +=09=09=09opt_grant_grant_option=20opt_granted_by=0A+=09=09=09=09{=0A+=09= =09=09=09=09GrantStmt=20*n=20=3D=20makeNode(GrantStmt);=0A+=09=09=09=09=09= n->is_grant=20=3D=20true;=0A+=09=09=09=09=09n->privileges=20=3D=20$2;=0A= +=09=09=09=09=09n->targtype=20=3D=20ACL_TARGET_OBJECT;=0A+=09=09=09=09=09= n->objtype=20=3D=20OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09n->objects=20=3D= =20$4;=0A+=09=09=09=09=09n->grantees=20=3D=20$6;=0A+=09=09=09=09=09= n->grant_option=20=3D=20$7;=0A+=09=09=09=09=09n->grantor=20=3D=20$8;=0A+=09= =09=09=09=09$$=20=3D=20(Node*)n;=0A+=09=09=09=09}=0A+=09=09;=0A+=0A= +cfgparam_target:=0A+=09=09=09cfgparam_name=0A+=09=09=09=09{=0A+=09=09=09= =09=09$$=20=3D=20list_make1(makeString($1));=0A+=09=09=09=09}=0A+=09=09=09= |=20cfgparam_target=20','=20cfgparam_name=0A+=09=09=09=09{=0A+=09=09=09=09= =09$$=20=3D=20lappend($1,=20makeString($3));=0A+=09=09=09=09}=0A=20=09=09= ;=0A=20=0A=20RevokeStmt:=0A@@=20-6917,6=20+6944,36=20@@=20RevokeStmt:=0A=20= =09=09=09=09=09n->behavior=20=3D=20$11;=0A=20=09=09=09=09=09$$=20=3D=20= (Node=20*)n;=0A=20=09=09=09=09}=0A+=09=09=09|=20REVOKE=20guc_priv_list=20= ON=20cfgparam_target=20FROM=20grantee_list=0A+=09=09=09opt_granted_by=20= opt_drop_behavior=0A+=09=09=09=09{=0A+=09=09=09=09=09GrantStmt=20*n=20=3D=20= makeNode(GrantStmt);=0A+=09=09=09=09=09n->is_grant=20=3D=20false;=0A+=09=09= =09=09=09n->grant_option=20=3D=20false;=0A+=09=09=09=09=09n->privileges=20= =3D=20$2;=0A+=09=09=09=09=09n->targtype=20=3D=20ACL_TARGET_OBJECT;=0A+=09= =09=09=09=09n->objtype=20=3D=20OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09= n->objects=20=3D=20$4;=0A+=09=09=09=09=09n->grantees=20=3D=20$6;=0A+=09=09= =09=09=09n->grantor=20=3D=20$7;=0A+=09=09=09=09=09n->behavior=20=3D=20= $8;=0A+=09=09=09=09=09$$=20=3D=20(Node=20*)n;=0A+=09=09=09=09}=0A+=09=09=09= |=20REVOKE=20GRANT=20OPTION=20FOR=20guc_priv_list=20ON=20cfgparam_target=0A= +=09=09=09FROM=20grantee_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=09n->is_grant=20=3D=20false;=0A+=09=09=09=09=09= n->grant_option=20=3D=20true;=0A+=09=09=09=09=09n->privileges=20=3D=20= $5;=0A+=09=09=09=09=09n->targtype=20=3D=20ACL_TARGET_OBJECT;=0A+=09=09=09= =09=09n->objtype=20=3D=20OBJECT_CONFIG_PARAM;=0A+=09=09=09=09=09= n->objects=20=3D=20$7;=0A+=09=09=09=09=09n->grantees=20=3D=20$9;=0A+=09=09= =09=09=09n->grantor=20=3D=20$10;=0A+=09=09=09=09=09n->behavior=20=3D=20= $11;=0A+=09=09=09=09=09$$=20=3D=20(Node=20*)n;=0A+=09=09=09=09}=0A=20=09=09= ;=0A=20=0A=20=0A@@=20-6985,6=20+7042,27=20@@=20privilege:=09SELECT=20= opt_column_list=0A=20=09=09=09}=0A=20=09=09;=0A=20=0A+guc_priv_list:=20= guc_priv=09=09=09=09=09=09=09=09{=20$$=20=3D=20list_make1($1);=20}=0A+=09= =09=09|=20guc_priv_list=20','=20guc_priv=09=09=09{=20$$=20=3D=20= lappend($1,=20$3);=20}=0A+=09=09;=0A+=0A+guc_priv:=0A+=09=09ALTER=20= SYSTEM_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("alter=20= system");=0A+=09=09=09=09n->cols=20=3D=20NIL;=0A+=09=09=09=09$$=20=3D=20= n;=0A+=09=09=09}=0A+=09=09|=20SET=20VALUE_P=0A+=09=09=09{=0A+=09=09=09=09= AccessPriv=20*n=20=3D=20makeNode(AccessPriv);=0A+=09=09=09=09= n->priv_name=20=3D=20pstrdup("set");=0A+=09=09=09=09n->cols=20=3D=20NIL;=0A= +=09=09=09=09$$=20=3D=20n;=0A+=09=09=09}=0A+=09=09;=0A+=0A=20=0A=20/*=20= Don't=20bother=20trying=20to=20fold=20the=20first=20two=20rules=20into=20= one=20using=0A=20=20*=20opt_table.=20=20You're=20going=20to=20get=20= conflicts.=0A@@=20-10658,6=20+10736,52=20@@=20any_with:=09WITH=0A=20=09=09= ;=0A=20=0A=20=0A= +/************************************************************************= *****=0A+=20*=0A+=20*=09CONFIGURATION=20PARAMETER=0A+=20*=0A+=20= **************************************************************************= ***/=0A+=0A+CreateConfigParamStmt:=0A+=09=09=09CREATE=20CONFIGURATION=20= PARAMETER=20opt_if_not_exists=20Sconst=0A+=09=09=09{=0A+=09=09=09=09= CreateConfigParamStmt=20*n=20=3D=20makeNode(CreateConfigParamStmt);=0A+=09= =09=09=09n->if_not_exists=20=3D=20$4;=0A+=09=09=09=09n->cfgparam_name=20= =3D=20$5;=0A+=09=09=09=09$$=20=3D=20(Node=20*)n;=0A+=09=09=09}=0A+=0A+=09= =09;=0A+=0A+DropConfigParamStmt:=0A+=09=09=09DROP=20CONFIGURATION=20= PARAMETER=20opt_if_exists=20Sconst=0A+=09=09=09{=0A+=09=09=09=09= DropConfigParamStmt=20*n=20=3D=20makeNode(DropConfigParamStmt);=0A+=09=09= =09=09n->missing_ok=20=3D=20$4;=0A+=09=09=09=09n->cfgparam_name=20=3D=20= $5;=0A+=09=09=09=09$$=20=3D=20(Node=20*)n;=0A+=09=09=09}=0A+=09=09;=0A+=0A= +cfgparam_name:=0A+=09=09=09ColId=0A+=09=09=09=09{=0A+=09=09=09=09=09$$=20= =3D=20$1;=0A+=09=09=09=09}=0A+=09=09=09|=20cfgparam_name=20'.'=20ColId=0A= +=09=09=09=09{=0A+=09=09=09=09=09char=20*str=20=3D=20psprintf("%s.%s",=20= $1,=20$3);=0A+=0A+=09=09=09=09=09if=20(strlen(str)=20>=3D=20NAMEDATALEN)=0A= +=09=09=09=09=09=09ereport(ERROR,=0A+=09=09=09=09=09=09=09=09= (errcode(ERRCODE_SYNTAX_ERROR),=0A+=09=09=09=09=09=09=09=09=20= errmsg("configuration=20parameter=20too=20long"),=0A+=09=09=09=09=09=09=09= =09=20parser_errposition(@1)));=0A+=0A+=09=09=09=09=09$$=20=3D=20str;=0A= +=09=09=09=09}=0A+=09=09;=0A+=0A=20= /*************************************************************************= ****=0A=20=20*=0A=20=20*=20Manipulate=20a=20conversion=0A@@=20-15728,6=20= +15852,7=20@@=20unreserved_keyword:=0A=20=09=09=09|=20OWNED=0A=20=09=09=09= |=20OWNER=0A=20=09=09=09|=20PARALLEL=0A+=09=09=09|=20PARAMETER=0A=20=09=09= =09|=20PARSER=0A=20=09=09=09|=20PARTIAL=0A=20=09=09=09|=20PARTITION=0A@@=20= -16306,6=20+16431,7=20@@=20bare_label_keyword:=0A=20=09=09=09|=20OWNED=0A= =20=09=09=09|=20OWNER=0A=20=09=09=09|=20PARALLEL=0A+=09=09=09|=20= PARAMETER=0A=20=09=09=09|=20PARSER=0A=20=09=09=09|=20PARTIAL=0A=20=09=09=09= |=20PARTITION=0Adiff=20--git=20a/src/backend/tcop/utility.c=20= b/src/backend/tcop/utility.c=0Aindex=201fbc387d47..832e6ddc31=20100644=0A= ---=20a/src/backend/tcop/utility.c=0A+++=20b/src/backend/tcop/utility.c=0A= @@=20-32,6=20+32,7=20@@=0A=20#include=20"commands/cluster.h"=0A=20= #include=20"commands/collationcmds.h"=0A=20#include=20= "commands/comment.h"=0A+#include=20"commands/configcmds.h"=0A=20#include=20= "commands/conversioncmds.h"=0A=20#include=20"commands/copy.h"=0A=20= #include=20"commands/createas.h"=0A@@=20-170,6=20+171,8=20@@=20= ClassifyUtilityCommandAsReadOnly(Node=20*parsetree)=0A=20=09=09case=20= T_CompositeTypeStmt:=0A=20=09=09case=20T_CreateAmStmt:=0A=20=09=09case=20= T_CreateCastStmt:=0A+=09=09case=20T_CreateConfigParamStmt:=0A+=09=09case=20= T_DropConfigParamStmt:=0A=20=09=09case=20T_CreateConversionStmt:=0A=20=09= =09case=20T_CreateDomainStmt:=0A=20=09=09case=20T_CreateEnumStmt:=0A@@=20= -896,6=20+899,19=20@@=20standard_ProcessUtility(PlannedStmt=20*pstmt,=0A=20= =09=09=09AlterEventTrigger((AlterEventTrigStmt=20*)=20parsetree);=0A=20=09= =09=09break;=0A=20=0A+=09=09=09/*=0A+=09=09=09=20*=20CONFIGURATION=20= PARAMETER=20statements=0A+=09=09=09=20*/=0A+=09=09case=20= T_CreateConfigParamStmt:=0A+=09=09=09/*=20no=20event=20triggers=20for=20= global=20objects=20*/=0A+=09=09=09= CreateConfigParam((CreateConfigParamStmt=20*)=20parsetree);=0A+=09=09=09= break;=0A+=0A+=09=09case=20T_DropConfigParamStmt:=0A+=09=09=09/*=20no=20= event=20triggers=20for=20global=20objects=20*/=0A+=09=09=09= DropConfigParam((DropConfigParamStmt=20*)=20parsetree);=0A+=09=09=09= break;=0A+=0A=20=09=09=09/*=0A=20=09=09=09=20*=20= ********************************=20ROLE=20statements=20****=0A=20=09=09=09= =20*/=0A@@=20-2974,6=20+2990,14=20@@=20CreateCommandTag(Node=20= *parsetree)=0A=20=09=09=09tag=20=3D=20CMDTAG_REINDEX;=0A=20=09=09=09= break;=0A=20=0A+=09=09case=20T_CreateConfigParamStmt:=0A+=09=09=09tag=20= =3D=20CMDTAG_CREATE_CONFIG_PARAM;=0A+=09=09=09break;=0A+=0A+=09=09case=20= T_DropConfigParamStmt:=0A+=09=09=09tag=20=3D=20CMDTAG_DROP_CONFIG_PARAM;=0A= +=09=09=09break;=0A+=0A=20=09=09case=20T_CreateConversionStmt:=0A=20=09=09= =09tag=20=3D=20CMDTAG_CREATE_CONVERSION;=0A=20=09=09=09break;=0A@@=20= -3590,6=20+3614,14=20@@=20GetCommandLogLevel(Node=20*parsetree)=0A=20=09=09= =09lev=20=3D=20LOGSTMT_ALL;=09/*=20should=20this=20be=20DDL?=20*/=0A=20=09= =09=09break;=0A=20=0A+=09=09case=20T_CreateConfigParamStmt:=0A+=09=09=09= lev=20=3D=20LOGSTMT_DDL;=0A+=09=09=09break;=0A+=0A+=09=09case=20= T_DropConfigParamStmt:=0A+=09=09=09lev=20=3D=20LOGSTMT_DDL;=0A+=09=09=09= break;=0A+=0A=20=09=09case=20T_CreateConversionStmt:=0A=20=09=09=09lev=20= =3D=20LOGSTMT_DDL;=0A=20=09=09=09break;=0Adiff=20--git=20= a/src/backend/utils/adt/acl.c=20b/src/backend/utils/adt/acl.c=0Aindex=20= 67f8b29434..595bd95230=20100644=0A---=20a/src/backend/utils/adt/acl.c=0A= +++=20b/src/backend/utils/adt/acl.c=0A@@=20-22,6=20+22,7=20@@=0A=20= #include=20"catalog/pg_auth_members.h"=0A=20#include=20= "catalog/pg_authid.h"=0A=20#include=20"catalog/pg_class.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_database.h"=0A=20= #include=20"catalog/pg_type.h"=0A=20#include=20"commands/dbcommands.h"=0A= @@=20-36,6=20+37,7=20@@=0A=20#include=20"utils/array.h"=0A=20#include=20= "utils/builtins.h"=0A=20#include=20"utils/catcache.h"=0A+#include=20= "utils/guc.h"=0A=20#include=20"utils/inval.h"=0A=20#include=20= "utils/lsyscache.h"=0A=20#include=20"utils/memutils.h"=0A@@=20-306,6=20= +308,12=20@@=20aclparse(const=20char=20*s,=20AclItem=20*aip)=0A=20=09=09=09= case=20ACL_CONNECT_CHR:=0A=20=09=09=09=09read=20=3D=20ACL_CONNECT;=0A=20=09= =09=09=09break;=0A+=09=09=09case=20ACL_SET_CHR:=0A+=09=09=09=09read=20=3D=20= ACL_SET;=0A+=09=09=09=09break;=0A+=09=09=09case=20ACL_ALTER_SYSTEM_CHR:=0A= +=09=09=09=09read=20=3D=20ACL_ALTER_SYSTEM;=0A+=09=09=09=09break;=0A=20=09= =09=09case=20'R':=09=09=09/*=20ignore=20old=20RULE=20privileges=20*/=0A=20= =09=09=09=09read=20=3D=200;=0A=20=09=09=09=09break;=0A@@=20-794,6=20= +802,10=20@@=20acldefault(ObjectType=20objtype,=20Oid=20ownerId)=0A=20=09= =09=09world_default=20=3D=20ACL_USAGE;=0A=20=09=09=09owner_default=20=3D=20= ACL_ALL_RIGHTS_TYPE;=0A=20=09=09=09break;=0A+=09=09case=20= OBJECT_CONFIG_PARAM:=0A+=09=09=09world_default=20=3D=20ACL_USAGE;=0A+=09=09= =09owner_default=20=3D=20ACL_ALL_RIGHTS_CONFIG_PARAM;=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-1602,6=20= +1614,10=20@@=20convert_priv_string(text=20*priv_type_text)=0A=20=09=09= return=20ACL_CREATE_TEMP;=0A=20=09if=20(pg_strcasecmp(priv_type,=20= "CONNECT")=20=3D=3D=200)=0A=20=09=09return=20ACL_CONNECT;=0A+=09if=20= (pg_strcasecmp(priv_type,=20"SET")=20=3D=3D=200)=0A+=09=09return=20= ACL_SET;=0A+=09if=20(pg_strcasecmp(priv_type,=20"ALTER=20SYSTEM")=20=3D=3D= =200)=0A+=09=09return=20ACL_ALTER_SYSTEM;=0A=20=09if=20= (pg_strcasecmp(priv_type,=20"RULE")=20=3D=3D=200)=0A=20=09=09return=200;=09= =09=09=09/*=20ignore=20old=20RULE=20privileges=20*/=0A=20=0A@@=20-1698,6=20= +1714,10=20@@=20convert_aclright_to_string(int=20aclright)=0A=20=09=09=09= return=20"TEMPORARY";=0A=20=09=09case=20ACL_CONNECT:=0A=20=09=09=09= return=20"CONNECT";=0A+=09=09case=20ACL_SET:=0A+=09=09=09return=20"SET";=0A= +=09=09case=20ACL_ALTER_SYSTEM:=0A+=09=09=09return=20"ALTER=20SYSTEM";=0A= =20=09=09default:=0A=20=09=09=09elog(ERROR,=20"unrecognized=20aclright:=20= %d",=20aclright);=0A=20=09=09=09return=20NULL;=0A@@=20-4670,6=20+4690,44=20= @@=20initialize_acl(void)=0A=20=09}=0A=20}=0A=20=0A+/*=0A+=20*=20= get_cfgparam_oid=20-=20Given=20a=20configuration=20parameter=20name,=20= look=20up=20the=0A+=20*=20configuration=20parameter's=20OID.=20=20Note=20= that=20names=20which=20are=20aliases=20for=0A+=20*=20a=20canonical=20= name=20will=20be=20translated=20automatically=20and=20the=20OID=20found.=0A= +=20*=0A+=20*=20If=20missing_ok=20is=20false,=20throw=20an=20error=20if=20= the=20configuration=20parameter=20name=0A+=20*=20is=20not=20found.=0A+=20= *=0A+=20*=20Returns=20the=20Oid=20of=20the=20configuration=20parameter.=0A= +=20*/=0A+Oid=0A+get_cfgparam_oid(const=20char=20*cfgname,=20bool=20= missing_ok)=0A+{=0A+=09Oid=09=09=09oid;=0A+=0A+=09/*=20Check=20for=20the=20= variable=20by=20the=20name=20we=20were=20given=20*/=0A+=09oid=20=3D=20= GetSysCacheOid1(CONFIGNAME,=20Anum_pg_config_param_oid,=0A+=09=09=09=09=09= =09=20=20CStringGetDatum(cfgname));=0A+=09if=20(!OidIsValid(oid))=0A+=09= {=0A+=09=09const=20char=20*canonical;=0A+=0A+=09=09/*=20Check=20if=20the=20= variable=20has=20a=20different=20canonical=20spelling=20*/=0A+=09=09= canonical=20=3D=20GetConfigOptionCanonicalName(cfgname);=0A+=09=09if=20= (canonical=20!=3D=20NULL)=0A+=09=09=09oid=20=3D=20= GetSysCacheOid1(CONFIGNAME,=20Anum_pg_config_param_oid,=0A+=09=09=09=09=09= =09=09=09=20=20CStringGetDatum(canonical));=0A+=0A+=09=09if=20= (!OidIsValid(oid)=20&&=20!missing_ok)=0A+=09=09=09ereport(ERROR,=0A+=09=09= =09=09=09(errcode(ERRCODE_UNDEFINED_OBJECT),=0A+=09=09=09=09=09=20= errmsg("configuration=20parameter=20\"%s\"=20does=20not=20exist",=0A+=09=09= =09=09=09=09=09cfgname)));=0A+=09}=0A+=0A+=09return=20oid;=0A+}=0A+=0A=20= /*=0A=20=20*=20RoleMembershipCacheCallback=0A=20=20*=09=09Syscache=20= inval=20callback=20function=0Adiff=20--git=20= a/src/backend/utils/cache/lsyscache.c=20= b/src/backend/utils/cache/lsyscache.c=0Aindex=204ebaa552a2..d0b927418a=20= 100644=0A---=20a/src/backend/utils/cache/lsyscache.c=0A+++=20= b/src/backend/utils/cache/lsyscache.c=0A@@=20-25,6=20+25,7=20@@=0A=20= #include=20"catalog/pg_amproc.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_language.h"=0A=20#include=20= "catalog/pg_namespace.h"=0A@@=20-3304,6=20+3305,25=20@@=20= free_attstatsslot(AttStatsSlot=20*sslot)=0A=20=09=09= pfree(sslot->numbers_arr);=0A=20}=0A=20=0A+char=20*=0A= +get_cfgparam_name(Oid=20configid)=0A+{=0A+=09HeapTuple=09tp;=0A+=0A+=09= tp=20=3D=20SearchSysCache1(CONFIGOID,=20ObjectIdGetDatum(configid));=0A+=09= if=20(HeapTupleIsValid(tp))=0A+=09{=0A+=09=09Form_pg_config_param=20= configtup=20=3D=20(Form_pg_config_param)=20GETSTRUCT(tp);=0A+=09=09char=09= =20=20=20*result;=0A+=0A+=09=09result=20=3D=20= pstrdup(NameStr(configtup->configname));=0A+=09=09ReleaseSysCache(tp);=0A= +=09=09return=20result;=0A+=09}=0A+=09else=0A+=09=09return=20NULL;=0A+}=0A= +=0A=20/*=09=09=09=09----------=20PG_NAMESPACE=20CACHE=20----------=09=09= =09=09=20*/=0A=20=0A=20/*=0Adiff=20--git=20= a/src/backend/utils/cache/syscache.c=20= b/src/backend/utils/cache/syscache.c=0Aindex=2056870b46e4..3d2b2ff531=20= 100644=0A---=20a/src/backend/utils/cache/syscache.c=0A+++=20= b/src/backend/utils/cache/syscache.c=0A@@=20-30,6=20+30,7=20@@=0A=20= #include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/pg_cast.h"=0A=20= #include=20"catalog/pg_collation.h"=0A+#include=20= "catalog/pg_config_param.h"=0A=20#include=20"catalog/pg_constraint.h"=0A=20= #include=20"catalog/pg_conversion.h"=0A=20#include=20= "catalog/pg_database.h"=0A@@=20-310,6=20+311,28=20@@=20static=20const=20= struct=20cachedesc=20cacheinfo[]=20=3D=20{=0A=20=09=09},=0A=20=09=098=0A=20= =09},=0A+=09{ConfigParamRelationId,=09=09/*=20CONFIGNAME=20*/=0A+=09=09= ConfigParamNameIndexId,=0A+=09=091,=0A+=09=09{=0A+=09=09=09= Anum_pg_config_param_configname,=0A+=09=09=090,=0A+=09=09=090,=0A+=09=09=09= 0=0A+=09=09},=0A+=09=09256=0A+=09},=0A+=09{ConfigParamRelationId,=09=09= /*=20CONFIGOID=20*/=0A+=09=09ConfigParamOidIndexId,=0A+=09=091,=0A+=09=09= {=0A+=09=09=09Anum_pg_config_param_oid,=0A+=09=09=090,=0A+=09=09=090,=0A= +=09=09=090=0A+=09=09},=0A+=09=09256=0A+=09},=0A=20=09= {ConversionRelationId,=09=09/*=20CONDEFAULT=20*/=0A=20=09=09= ConversionDefaultIndexId,=0A=20=09=094,=0Adiff=20--git=20= a/src/backend/utils/misc/README=20b/src/backend/utils/misc/README=0A= index=206e294386f7..7ad2a780d9=20100644=0A---=20= a/src/backend/utils/misc/README=0A+++=20b/src/backend/utils/misc/README=0A= @@=20-252,6=20+252,17=20@@=20actual=20variable,=20and=20are=20not=20= directly=20aware=20of=20the=20additional=20values=0A=20maintained=20by=20= GUC.=0A=20=0A=20=0A+Per-Variable=20Grantable=20Privileges=0A= +---------------------------------=0A+=0A+For=20each=20GUC=20variable,=20= if=20the=20name=20of=20the=20variable=20is=20entered=20into=0A= +catalog/pg_config_param.dat,=20or=20alternatively=20if=20CREATE=20= CONFIGURATION=20PARAMETER=0A+is=20run=20to=20add=20a=20catalog=20entry=20= for=20the=20variable,=20then=20permission=20to=20SET=20or=20ALTER=0A= +SYSTEM=20on=20the=20guc=20can=20be=20assigned=20to=20roles.=20=20= Otherwise,=20these=20commands=20can=0A+still=20be=20run=20by=20users=20= or=20superusers=20as=20normal,=20but=20grants=20on=20the=20variable=0A= +cannot=20be=20performed.=0A+=0A+=0A=20GUC=20Memory=20Handling=0A=20= -------------------=0A=20=0Adiff=20--git=20= a/src/backend/utils/misc/guc.c=20b/src/backend/utils/misc/guc.c=0Aindex=20= e91d5a3cfd..73c5808930=20100644=0A---=20a/src/backend/utils/misc/guc.c=0A= +++=20b/src/backend/utils/misc/guc.c=0A@@=20-8533,16=20+8533,32=20@@=20= AlterSystemSetConfigFile(AlterSystemStmt=20*altersysstmt)=0A=20=09char=09= =09AutoConfFileName[MAXPGPATH];=0A=20=09char=09=09= AutoConfTmpFileName[MAXPGPATH];=0A=20=0A-=09if=20(!superuser())=0A-=09=09= ereport(ERROR,=0A-=09=09=09=09(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A= -=09=09=09=09=20errmsg("must=20be=20superuser=20to=20execute=20ALTER=20= SYSTEM=20command")));=0A-=0A=20=09/*=0A=20=09=20*=20Extract=20statement=20= arguments=0A=20=09=20*/=0A=20=09name=20=3D=20= altersysstmt->setstmt->name;=0A=20=0A+=09/*=0A+=09=20*=20Check=20= permission=20to=20run=20ALTER=20SYSTEM=20on=20the=20target=20variable=20= registered.=0A+=09=20*/=0A+=09if=20(!superuser())=0A+=09{=0A+=09=09= AclResult=09aclresult;=0A+=09=09Oid=09=09=09cfgId;=0A+=0A+=09=09cfgId=20= =3D=20get_cfgparam_oid(name,=20true);=0A+=09=09if=20(!OidIsValid(cfgId))=0A= +=09=09=09ereport(ERROR,=0A+=09=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=09=20= errmsg("permission=20denied=20to=20set=20parameter=20\"%s\"",=0A+=09=09=09= =09=09=09=09name)));=0A+=0A+=09=09aclresult=20=3D=20= pg_config_param_aclcheck(cfgId,=20GetUserId(),=0A+=09=09=09=09=09=09=09=09= =09=09=09=20ACL_ALTER_SYSTEM);=0A+=09=09if=20(aclresult=20!=3D=20= ACLCHECK_OK)=0A+=09=09=09aclcheck_error(aclresult,=20= OBJECT_CONFIG_PARAM,=20name);=0A+=09}=0A+=0A=20=09switch=20= (altersysstmt->setstmt->kind)=0A=20=09{=0A=20=09=09case=20VAR_SET_VALUE:=0A= @@=20-8735,6=20+8751,9=20@@=20void=0A=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20{=0A= =20=09GucAction=09action=20=3D=20stmt->is_local=20?=20GUC_ACTION_LOCAL=20= :=20GUC_ACTION_SET;=0A+=09GucContext=09context;=0A+=09AclResult=09= aclresult;=0A+=09Oid=09=09=09cfgId;=0A=20=0A=20=09/*=0A=20=09=20*=20= Workers=20synchronize=20these=20parameters=20at=20the=20start=20of=20the=20= parallel=0A@@=20-8745,6=20+8764,20=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=09= =09=09=09(errcode(ERRCODE_INVALID_TRANSACTION_STATE),=0A=20=09=09=09=09=20= errmsg("cannot=20set=20parameters=20during=20a=20parallel=20= operation")));=0A=20=0A+=09/*=0A+=09=20*=20Superusers=20and=20users=20= who=20have=20been=20granted=20SET=20privilege=20can=20set=20with=0A+=09=20= *=20PGC_SUSET=20context.=20=20All=20others=20have=20only=20PGC_USERSET.=0A= +=09=20*/=0A+=09context=20=3D=20PGC_USERSET;=0A+=09if=20(superuser())=0A= +=09=09context=20=3D=20PGC_SUSET;=0A+=09else=20if=20(OidIsValid(cfgId=20= =3D=20get_cfgparam_oid(stmt->name,=20true)))=0A+=09{=0A+=09=09aclresult=20= =3D=20pg_config_param_aclcheck(cfgId,=20GetUserId(),=20ACL_SET);=0A+=09=09= if=20(aclresult=20=3D=3D=20ACLCHECK_OK)=0A+=09=09=09context=20=3D=20= PGC_SUSET;=0A+=09}=0A+=0A=20=09switch=20(stmt->kind)=0A=20=09{=0A=20=09=09= case=20VAR_SET_VALUE:=0A@@=20-8753,7=20+8786,7=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=09= =09=09=09WarnNoTransactionBlock(isTopLevel,=20"SET=20LOCAL");=0A=20=09=09= =09(void)=20set_config_option(stmt->name,=0A=20=09=09=09=09=09=09=09=09=09= =20ExtractSetVariableArgs(stmt),=0A-=09=09=09=09=09=09=09=09=09=20= (superuser()=20?=20PGC_SUSET=20:=20PGC_USERSET),=0A+=09=09=09=09=09=09=09= =09=09=20context,=0A=20=09=09=09=09=09=09=09=09=09=20PGC_S_SESSION,=0A=20= =09=09=09=09=09=09=09=09=09=20action,=20true,=200,=20false);=0A=20=09=09=09= break;=0A@@=20-8838,7=20+8871,7=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=0A= =20=09=09=09(void)=20set_config_option(stmt->name,=0A=20=09=09=09=09=09=09= =09=09=09=20NULL,=0A-=09=09=09=09=09=09=09=09=09=20(superuser()=20?=20= PGC_SUSET=20:=20PGC_USERSET),=0A+=09=09=09=09=09=09=09=09=09=20context,=0A= =20=09=09=09=09=09=09=09=09=09=20PGC_S_SESSION,=0A=20=09=09=09=09=09=09=09= =09=09=20action,=20true,=200,=20false);=0A=20=09=09=09break;=0A@@=20= -9578,6=20+9611,22=20@@=20get_explain_guc_options(int=20*num)=0A=20=09= return=20result;=0A=20}=0A=20=0A+/*=0A+=20*=20Return=20GUC=20variable=20= canonical=20name,=20or=20NULL=20if=20no=20variable=20by=20the=20given=0A= +=20*=20name=20or=20alias=20exists.=0A+=20*/=0A+const=20char=20*=0A= +GetConfigOptionCanonicalName(const=20char=20*alias)=0A+{=0A+=09struct=20= config_generic=20*record;=0A+=0A+=09record=20=3D=20find_option(alias,=20= false,=20true,=20LOG);=0A+=09if=20(record=20=3D=3D=20NULL)=0A+=09=09= return=20NULL;=0A+=0A+=09return=20record->name;=0A+}=0A+=0A=20/*=0A=20=20= *=20Return=20GUC=20variable=20value=20by=20name;=20optionally=20return=20= canonical=20form=20of=0A=20=20*=20name.=20=20If=20the=20GUC=20is=20= unset,=20then=20throw=20an=20error=20unless=20missing_ok=20is=20true,=0A= diff=20--git=20a/src/bin/pg_dump/pg_dump.c=20b/src/bin/pg_dump/pg_dump.c=0A= index=207e98371d25..eae9ba27c2=20100644=0A---=20= a/src/bin/pg_dump/pg_dump.c=0A+++=20b/src/bin/pg_dump/pg_dump.c=0A@@=20= -15043,6=20+15043,9=20@@=20dumpDefaultACL(Archive=20*fout,=20const=20= DefaultACLInfo=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=20= DEFACLOBJ_CONFIG_PARAM:=0A+=09=09=09type=20=3D=20"CONFIGURATION=20= PARAMETERS";=0A+=09=09=09break;=0A=20=09=09default:=0A=20=09=09=09/*=20= shouldn't=20get=20here=20*/=0A=20=09=09=09fatal("unrecognized=20object=20= type=20in=20default=20privileges:=20%d",=0Adiff=20--git=20= a/src/include/catalog/dependency.h=20b/src/include/catalog/dependency.h=0A= index=203eca295ff4..ab92782d15=20100644=0A---=20= a/src/include/catalog/dependency.h=0A+++=20= b/src/include/catalog/dependency.h=0A@@=20-92,6=20+92,7=20@@=20typedef=20= enum=20ObjectClass=0A=20=09OCLASS_TYPE,=09=09=09=09/*=20pg_type=20*/=0A=20= =09OCLASS_CAST,=09=09=09=09/*=20pg_cast=20*/=0A=20=09OCLASS_COLLATION,=09= =09=09/*=20pg_collation=20*/=0A+=09OCLASS_CONFIG_PARAM,=09=09/*=20= pg_config_param=20*/=0A=20=09OCLASS_CONSTRAINT,=09=09=09/*=20= pg_constraint=20*/=0A=20=09OCLASS_CONVERSION,=09=09=09/*=20pg_conversion=20= */=0A=20=09OCLASS_DEFAULT,=09=09=09=09/*=20pg_attrdef=20*/=0Adiff=20= --git=20a/src/include/catalog/pg_config_param.dat=20= b/src/include/catalog/pg_config_param.dat=0Anew=20file=20mode=20100644=0A= index=200000000000..5285cf54d3=0A---=20/dev/null=0A+++=20= b/src/include/catalog/pg_config_param.dat=0A@@=20-0,0=20+1,211=20@@=0A+{=20= configname=20=3D>=20'DateStyle'=20},=0A+{=20configname=20=3D>=20= 'IntervalStyle'=20},=0A+{=20configname=20=3D>=20'TimeZone'=20},=0A+{=20= configname=20=3D>=20'allow_system_table_mods'=20},=0A+{=20configname=20= =3D>=20'application_name'=20},=0A+{=20configname=20=3D>=20= 'archive_timeout'=20},=0A+{=20configname=20=3D>=20= 'authentication_timeout'=20},=0A+{=20configname=20=3D>=20= 'autovacuum_naptime'=20},=0A+{=20configname=20=3D>=20= 'autovacuum_vacuum_cost_delay'=20},=0A+{=20configname=20=3D>=20= 'autovacuum_work_mem'=20},=0A+{=20configname=20=3D>=20= 'backend_flush_after'=20},=0A+{=20configname=20=3D>=20= 'backtrace_functions'=20},=0A+{=20configname=20=3D>=20'bgwriter_delay'=20= },=0A+{=20configname=20=3D>=20'bgwriter_flush_after'=20},=0A+{=20= configname=20=3D>=20'block_size'=20},=0A+{=20configname=20=3D>=20= 'checkpoint_flush_after'=20},=0A+{=20configname=20=3D>=20= 'checkpoint_timeout'=20},=0A+{=20configname=20=3D>=20= 'checkpoint_warning'=20},=0A+{=20configname=20=3D>=20= 'client_connection_check_interval'=20},=0A+{=20configname=20=3D>=20= 'client_encoding'=20},=0A+{=20configname=20=3D>=20'cluster_name'=20},=0A= +{=20configname=20=3D>=20'config_file'=20},=0A+{=20configname=20=3D>=20= 'constraint_exclusion'=20},=0A+{=20configname=20=3D>=20= 'cpu_index_tuple_cost'=20},=0A+{=20configname=20=3D>=20= 'cpu_operator_cost'=20},=0A+{=20configname=20=3D>=20'cpu_tuple_cost'=20= },=0A+{=20configname=20=3D>=20'cursor_tuple_fraction'=20},=0A+{=20= configname=20=3D>=20'data_checksums'=20},=0A+{=20configname=20=3D>=20= 'data_directory'=20},=0A+{=20configname=20=3D>=20'data_directory_mode'=20= },=0A+{=20configname=20=3D>=20'deadlock_timeout'=20},=0A+{=20configname=20= =3D>=20'debug_assertions'=20},=0A+{=20configname=20=3D>=20= 'debug_deadlocks'=20},=0A+{=20configname=20=3D>=20'debug_discard_caches'=20= },=0A+{=20configname=20=3D>=20'default_table_access_method'=20},=0A+{=20= configname=20=3D>=20'default_tablespace'=20},=0A+{=20configname=20=3D>=20= 'default_transaction_read_only'=20},=0A+{=20configname=20=3D>=20= 'default_with_oids'=20},=0A+{=20configname=20=3D>=20= 'dynamic_library_path'=20},=0A+{=20configname=20=3D>=20= 'effective_cache_size'=20},=0A+{=20configname=20=3D>=20= 'effective_io_concurrency'=20},=0A+{=20configname=20=3D>=20= 'enable_async_append'=20},=0A+{=20configname=20=3D>=20= 'enable_bitmapscan'=20},=0A+{=20configname=20=3D>=20'enable_gathermerge'=20= },=0A+{=20configname=20=3D>=20'enable_hashagg'=20},=0A+{=20configname=20= =3D>=20'enable_hashjoin'=20},=0A+{=20configname=20=3D>=20= 'enable_indexonlyscan'=20},=0A+{=20configname=20=3D>=20= 'enable_indexscan'=20},=0A+{=20configname=20=3D>=20'enable_material'=20= },=0A+{=20configname=20=3D>=20'enable_memoize'=20},=0A+{=20configname=20= =3D>=20'enable_mergejoin'=20},=0A+{=20configname=20=3D>=20= 'enable_nestloop'=20},=0A+{=20configname=20=3D>=20= 'enable_parallel_append'=20},=0A+{=20configname=20=3D>=20= 'enable_parallel_hash'=20},=0A+{=20configname=20=3D>=20= 'enable_partition_pruning'=20},=0A+{=20configname=20=3D>=20= 'enable_partitionwise_aggregate'=20},=0A+{=20configname=20=3D>=20= 'enable_partitionwise_join'=20},=0A+{=20configname=20=3D>=20= 'enable_seqscan'=20},=0A+{=20configname=20=3D>=20'enable_sort'=20},=0A+{=20= configname=20=3D>=20'enable_tidscan'=20},=0A+{=20configname=20=3D>=20= 'external_pid_file'=20},=0A+{=20configname=20=3D>=20= 'force_parallel_mode'=20},=0A+{=20configname=20=3D>=20= 'from_collapse_limit'=20},=0A+{=20configname=20=3D>=20'geqo'=20},=0A+{=20= configname=20=3D>=20'geqo_effort'=20},=0A+{=20configname=20=3D>=20= 'geqo_generations'=20},=0A+{=20configname=20=3D>=20'geqo_pool_size'=20},=0A= +{=20configname=20=3D>=20'geqo_seed'=20},=0A+{=20configname=20=3D>=20= 'geqo_selection_bias'=20},=0A+{=20configname=20=3D>=20'geqo_threshold'=20= },=0A+{=20configname=20=3D>=20'gin_pending_list_limit'=20},=0A+{=20= configname=20=3D>=20'hash_mem_multiplier'=20},=0A+{=20configname=20=3D>=20= 'huge_page_size'=20},=0A+{=20configname=20=3D>=20= 'idle_in_transaction_session_timeout'=20},=0A+{=20configname=20=3D>=20= 'idle_session_timeout'=20},=0A+{=20configname=20=3D>=20= 'ignore_checksum_failure'=20},=0A+{=20configname=20=3D>=20= 'ignore_invalid_pages'=20},=0A+{=20configname=20=3D>=20= 'ignore_system_indexes'=20},=0A+{=20configname=20=3D>=20'in_hot_standby'=20= },=0A+{=20configname=20=3D>=20'integer_datetimes'=20},=0A+{=20configname=20= =3D>=20'is_superuser'=20},=0A+{=20configname=20=3D>=20'jit'=20},=0A+{=20= configname=20=3D>=20'jit_above_cost'=20},=0A+{=20configname=20=3D>=20= 'jit_debugging_support'=20},=0A+{=20configname=20=3D>=20= 'jit_dump_bitcode'=20},=0A+{=20configname=20=3D>=20'jit_expressions'=20= },=0A+{=20configname=20=3D>=20'jit_inline_above_cost'=20},=0A+{=20= configname=20=3D>=20'jit_optimize_above_cost'=20},=0A+{=20configname=20= =3D>=20'jit_profiling_support'=20},=0A+{=20configname=20=3D>=20= 'jit_provider'=20},=0A+{=20configname=20=3D>=20'jit_tuple_deforming'=20= },=0A+{=20configname=20=3D>=20'join_collapse_limit'=20},=0A+{=20= configname=20=3D>=20'krb_server_keyfile'=20},=0A+{=20configname=20=3D>=20= 'lc_collate'=20},=0A+{=20configname=20=3D>=20'lc_ctype'=20},=0A+{=20= configname=20=3D>=20'listen_addresses'=20},=0A+{=20configname=20=3D>=20= 'local_preload_libraries'=20},=0A+{=20configname=20=3D>=20'lock_timeout'=20= },=0A+{=20configname=20=3D>=20'log_autovacuum_min_duration'=20},=0A+{=20= configname=20=3D>=20'log_btree_build_stats'=20},=0A+{=20configname=20=3D>=20= 'log_directory'=20},=0A+{=20configname=20=3D>=20'log_filename'=20},=0A+{=20= configname=20=3D>=20'log_min_duration_sample'=20},=0A+{=20configname=20= =3D>=20'log_min_duration_statement'=20},=0A+{=20configname=20=3D>=20= 'log_parameter_max_length'=20},=0A+{=20configname=20=3D>=20= 'log_parameter_max_length_on_error'=20},=0A+{=20configname=20=3D>=20= 'log_rotation_age'=20},=0A+{=20configname=20=3D>=20'log_rotation_size'=20= },=0A+{=20configname=20=3D>=20'log_startup_progress_interval'=20},=0A+{=20= configname=20=3D>=20'log_temp_files'=20},=0A+{=20configname=20=3D>=20= 'logical_decoding_work_mem'=20},=0A+{=20configname=20=3D>=20= 'maintenance_io_concurrency'=20},=0A+{=20configname=20=3D>=20= 'maintenance_work_mem'=20},=0A+{=20configname=20=3D>=20= 'max_function_args'=20},=0A+{=20configname=20=3D>=20= 'max_identifier_length'=20},=0A+{=20configname=20=3D>=20'max_index_keys'=20= },=0A+{=20configname=20=3D>=20'max_parallel_workers'=20},=0A+{=20= configname=20=3D>=20'max_parallel_workers_per_gather'=20},=0A+{=20= configname=20=3D>=20'max_slot_wal_keep_size'=20},=0A+{=20configname=20=3D>= =20'max_stack_depth'=20},=0A+{=20configname=20=3D>=20= 'max_standby_archive_delay'=20},=0A+{=20configname=20=3D>=20= 'max_standby_streaming_delay'=20},=0A+{=20configname=20=3D>=20= 'max_wal_size'=20},=0A+{=20configname=20=3D>=20= 'min_dynamic_shared_memory'=20},=0A+{=20configname=20=3D>=20= 'min_parallel_index_scan_size'=20},=0A+{=20configname=20=3D>=20= 'min_parallel_table_scan_size'=20},=0A+{=20configname=20=3D>=20= 'min_wal_size'=20},=0A+{=20configname=20=3D>=20'old_snapshot_threshold'=20= },=0A+{=20configname=20=3D>=20'optimize_bounded_sort'=20},=0A+{=20= configname=20=3D>=20'parallel_leader_participation'=20},=0A+{=20= configname=20=3D>=20'parallel_setup_cost'=20},=0A+{=20configname=20=3D>=20= 'parallel_tuple_cost'=20},=0A+{=20configname=20=3D>=20'plan_cache_mode'=20= },=0A+{=20configname=20=3D>=20'plperl.on_init'=20},=0A+{=20configname=20= =3D>=20'plperl.on_plperl_init'=20},=0A+{=20configname=20=3D>=20= 'plperl.on_plperlu_init'=20},=0A+{=20configname=20=3D>=20= 'plperl.use_strict'=20},=0A+{=20configname=20=3D>=20= 'plpgsql.check_asserts'=20},=0A+{=20configname=20=3D>=20= 'plpgsql.extra_errors'=20},=0A+{=20configname=20=3D>=20= 'plpgsql.extra_warnings'=20},=0A+{=20configname=20=3D>=20= 'plpgsql.print_strict_params'=20},=0A+{=20configname=20=3D>=20= 'plpgsql.variable_conflict'=20},=0A+{=20configname=20=3D>=20= 'pltcl.start_proc'=20},=0A+{=20configname=20=3D>=20'pltclu.start_proc'=20= },=0A+{=20configname=20=3D>=20'post_auth_delay'=20},=0A+{=20configname=20= =3D>=20'pre_auth_delay'=20},=0A+{=20configname=20=3D>=20= 'primary_conninfo'=20},=0A+{=20configname=20=3D>=20'random_page_cost'=20= },=0A+{=20configname=20=3D>=20'recovery_min_apply_delay'=20},=0A+{=20= configname=20=3D>=20'remove_temp_files_after_crash'=20},=0A+{=20= configname=20=3D>=20'role'=20},=0A+{=20configname=20=3D>=20'search_path'=20= },=0A+{=20configname=20=3D>=20'seed'=20},=0A+{=20configname=20=3D>=20= 'segment_size'=20},=0A+{=20configname=20=3D>=20'seq_page_cost'=20},=0A+{=20= configname=20=3D>=20'server_encoding'=20},=0A+{=20configname=20=3D>=20= 'server_version'=20},=0A+{=20configname=20=3D>=20'server_version_num'=20= },=0A+{=20configname=20=3D>=20'session_authorization'=20},=0A+{=20= configname=20=3D>=20'session_preload_libraries'=20},=0A+{=20configname=20= =3D>=20'shared_buffers'=20},=0A+{=20configname=20=3D>=20= 'shared_memory_size'=20},=0A+{=20configname=20=3D>=20= 'shared_memory_size_in_huge_pages'=20},=0A+{=20configname=20=3D>=20= 'shared_preload_libraries'=20},=0A+{=20configname=20=3D>=20'ssl_ciphers'=20= },=0A+{=20configname=20=3D>=20'ssl_dh_params_file'=20},=0A+{=20= configname=20=3D>=20'ssl_ecdh_curve'=20},=0A+{=20configname=20=3D>=20= 'ssl_library'=20},=0A+{=20configname=20=3D>=20'ssl_max_protocol_version'=20= },=0A+{=20configname=20=3D>=20'ssl_min_protocol_version'=20},=0A+{=20= configname=20=3D>=20'ssl_passphrase_command'=20},=0A+{=20configname=20=3D>= =20'ssl_renegotiation_limit'=20},=0A+{=20configname=20=3D>=20= 'standard_conforming_strings'=20},=0A+{=20configname=20=3D>=20= 'statement_timeout'=20},=0A+{=20configname=20=3D>=20= 'stats_temp_directory'=20},=0A+{=20configname=20=3D>=20= 'synchronous_standby_names'=20},=0A+{=20configname=20=3D>=20= 'tcp_keepalives_idle'=20},=0A+{=20configname=20=3D>=20= 'tcp_keepalives_interval'=20},=0A+{=20configname=20=3D>=20= 'tcp_user_timeout'=20},=0A+{=20configname=20=3D>=20'temp_buffers'=20},=0A= +{=20configname=20=3D>=20'temp_file_limit'=20},=0A+{=20configname=20=3D>=20= 'temp_tablespaces'=20},=0A+{=20configname=20=3D>=20'trace_lock_oidmin'=20= },=0A+{=20configname=20=3D>=20'trace_lock_table'=20},=0A+{=20configname=20= =3D>=20'trace_locks'=20},=0A+{=20configname=20=3D>=20'trace_lwlocks'=20= },=0A+{=20configname=20=3D>=20'trace_notify'=20},=0A+{=20configname=20=3D>= =20'trace_sort'=20},=0A+{=20configname=20=3D>=20'trace_syncscan'=20},=0A= +{=20configname=20=3D>=20'trace_userlocks'=20},=0A+{=20configname=20=3D>=20= 'track_activity_query_size'=20},=0A+{=20configname=20=3D>=20= 'transaction_deferrable'=20},=0A+{=20configname=20=3D>=20= 'transaction_isolation'=20},=0A+{=20configname=20=3D>=20= 'transaction_read_only'=20},=0A+{=20configname=20=3D>=20= 'unix_socket_directories'=20},=0A+{=20configname=20=3D>=20= 'vacuum_cost_delay'=20},=0A+{=20configname=20=3D>=20'wal_block_size'=20= },=0A+{=20configname=20=3D>=20'wal_buffers'=20},=0A+{=20configname=20=3D>=20= 'wal_consistency_checking'=20},=0A+{=20configname=20=3D>=20'wal_debug'=20= },=0A+{=20configname=20=3D>=20'wal_keep_size'=20},=0A+{=20configname=20= =3D>=20'wal_receiver_status_interval'=20},=0A+{=20configname=20=3D>=20= 'wal_receiver_timeout'=20},=0A+{=20configname=20=3D>=20= 'wal_retrieve_retry_interval'=20},=0A+{=20configname=20=3D>=20= 'wal_segment_size'=20},=0A+{=20configname=20=3D>=20'wal_sender_timeout'=20= },=0A+{=20configname=20=3D>=20'wal_skip_threshold'=20},=0A+{=20= configname=20=3D>=20'wal_writer_delay'=20},=0A+{=20configname=20=3D>=20= 'wal_writer_flush_after'=20},=0A+{=20configname=20=3D>=20'work_mem'=20},=0A= +{=20configname=20=3D>=20'zero_damaged_pages'=20},=0Adiff=20--git=20= a/src/include/catalog/pg_config_param.h=20= b/src/include/catalog/pg_config_param.h=0Anew=20file=20mode=20100644=0A= index=200000000000..d8e640bb77=0A---=20/dev/null=0A+++=20= b/src/include/catalog/pg_config_param.h=0A@@=20-0,0=20+1,61=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20pg_config_param.h=0A+=20*=09=20=20definition=20of=20= the=20"configuration=20parameter"=20system=20catalog=0A+=20*=09=20=20= (pg_config_param).=0A+=20*=0A+=20*=0A+=20*=20Portions=20Copyright=20(c)=20= 1996-2021,=20PostgreSQL=20Global=20Development=20Group=0A+=20*=20= Portions=20Copyright=20(c)=201994,=20Regents=20of=20the=20University=20= of=20California=0A+=20*=0A+=20*=20src/include/catalog/pg_config_param.h=0A= +=20*=0A+=20*=20NOTES=0A+=20*=09=20=20The=20Catalog.pm=20module=20reads=20= this=20file=20and=20derives=20schema=0A+=20*=09=20=20information.=0A+=20= *=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#ifndef=20PG_CONFIG_PARAM_H=0A+#define=20PG_CONFIG_PARAM_H=0A= +=0A+#include=20"catalog/genbki.h"=0A+#include=20= "catalog/pg_config_param_d.h"=0A+=0A+/*=20----------------=0A+=20*=09=09= pg_config_param=20definition.=20=20cpp=20turns=20this=20into=0A+=20*=09=09= typedef=20struct=20FormData_pg_config_param=0A+=20*=20----------------=0A= +=20*/=0A+CATALOG(pg_config_param,8923,ConfigParamRelationId)=20= BKI_SHARED_RELATION=0A+{=0A+=09Oid=09=09=09oid;=09=09=09/*=20oid=20*/=0A= +=09NameData=09configname;=09=09/*=20configuration=20parameter=20name=20= */=0A+=09Oid=09=09=09configowner=20BKI_DEFAULT(POSTGRES)=20= BKI_LOOKUP(pg_authid);=0A+=0A+#ifdef=20CATALOG_VARLEN=09=09=09/*=20= variable-length=20fields=20start=20here=20*/=0A+=09/*=20Access=20= privileges=20*/=0A+=09aclitem=09=09cfgacl[1]=20BKI_DEFAULT(_null_);=0A= +#endif=0A+}=20FormData_pg_config_param;=0A+=0A+=0A+/*=20= ----------------=0A+=20*=09=09Form_pg_config_param=20corresponds=20to=20= a=20pointer=20to=20a=20tuple=20with=0A+=20*=09=09the=20format=20of=20= pg_config_param=20relation.=0A+=20*=20----------------=0A+=20*/=0A= +typedef=20FormData_pg_config_param=20*Form_pg_config_param;=0A+=0A= +DECLARE_TOAST(pg_config_param,=208924,=208925);=0A+#define=20= PgConfigParamToastTable=208924=0A+#define=20PgConfigParamToastIndex=20= 8925=0A+=0A+DECLARE_UNIQUE_INDEX(pg_cfgparam_name_index,=208926,=20= ConfigParamNameIndexId,=20on=20pg_config_param=20using=20= btree(configname=20name_ops));=0A= +DECLARE_UNIQUE_INDEX_PKEY(pg_config_param_oid_index,=208927,=20= ConfigParamOidIndexId,=20on=20pg_config_param=20using=20btree(oid=20= oid_ops));=0A+=0A+extern=20Oid=09ConfigParamCreate(const=20char=20= *configname,=20Oid=20configowner,=0A+=09=09=09=09=09=09=09=20=20bool=20= if_not_exists);=0A+extern=20void=09ConfigParamDrop(const=20char=20= *configname,=20bool=20missing_ok);=0A+=0A+#endif=09=09=09=09=09=09=09/*=20= PG_CONFIG_PARAM_H=20*/=0Adiff=20--git=20= a/src/include/catalog/pg_default_acl.h=20= b/src/include/catalog/pg_default_acl.h=0Aindex=20eb72dd6293..4ca71b2258=20= 100644=0A---=20a/src/include/catalog/pg_default_acl.h=0A+++=20= b/src/include/catalog/pg_default_acl.h=0A@@=20-66,6=20+66,7=20@@=20= DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index,=20828,=20= DefaultAclOidIndexId,=20o=0A=20#define=20DEFACLOBJ_FUNCTION=09=09'f'=20= /*=20function=20*/=0A=20#define=20DEFACLOBJ_TYPE=09=09=09'T'=20/*=20type=20= */=0A=20#define=20DEFACLOBJ_NAMESPACE=09=09'n'=20/*=20namespace=20*/=0A= +#define=20DEFACLOBJ_CONFIG_PARAM=09'c'=20/*=20configuration=20parameter=20= */=0A=20=0A=20#endif=09=09=09=09=09=09=09/*=20EXPOSE_TO_CLIENT_CODE=20*/=0A= =20=0Adiff=20--git=20a/src/include/commands/configcmds.h=20= b/src/include/commands/configcmds.h=0Anew=20file=20mode=20100644=0Aindex=20= 0000000000..4c9b80a4dc=0A---=20/dev/null=0A+++=20= b/src/include/commands/configcmds.h=0A@@=20-0,0=20+1,17=20@@=0A= +/*-----------------------------------------------------------------------= --=0A+=20*=0A+=20*=20configcmds.h=0A+=20*=09=20=20Commands=20for=20= manipulating=20configuration=20parameters=20(GUC=20variables).=0A+=20*=0A= +=20*=0A+=20*=20src/include/commands/configcmds.h=0A+=20*=0A+=20= *-------------------------------------------------------------------------= =0A+=20*/=0A+#ifndef=20CONFIGCMDS_H=0A+#define=20CONFIGCMDS_H=0A+=0A= +extern=20Oid=09CreateConfigParam(CreateConfigParamStmt=20*stmt);=0A= +extern=20void=20DropConfigParam(DropConfigParamStmt=20*stmt);=0A+=0A= +#endif=09=09=09=09=09=09=09/*=20CONFIGCMDS_H=20*/=0Adiff=20--git=20= a/src/include/nodes/nodes.h=20b/src/include/nodes/nodes.h=0Aindex=20= 7c657c1241..3d19dfb285=20100644=0A---=20a/src/include/nodes/nodes.h=0A= +++=20b/src/include/nodes/nodes.h=0A@@=20-371,6=20+371,8=20@@=20typedef=20= enum=20NodeTag=0A=20=09T_AlterDatabaseStmt,=0A=20=09= T_AlterDatabaseSetStmt,=0A=20=09T_AlterRoleSetStmt,=0A+=09= T_CreateConfigParamStmt,=0A+=09T_DropConfigParamStmt,=0A=20=09= T_CreateConversionStmt,=0A=20=09T_CreateCastStmt,=0A=20=09= T_CreateOpClassStmt,=0Adiff=20--git=20a/src/include/nodes/parsenodes.h=20= b/src/include/nodes/parsenodes.h=0Aindex=20067138e6b5..5d282623ff=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<=20pg_class=20= {oid}=0A=20NOTICE:=20=20checking=20pg_class=20{relrewrite}=20=3D>=20= pg_class=20{oid}=0A=20NOTICE:=20=20checking=20pg_attrdef=20{adrelid}=20= =3D>=20pg_class=20{oid}=0A=20NOTICE:=20=20checking=20pg_attrdef=20= {adrelid,adnum}=20=3D>=20pg_attribute=20{attrelid,attnum}=0A+NOTICE:=20=20= checking=20pg_config_param=20{configowner}=20=3D>=20pg_authid=20{oid}=0A=20= NOTICE:=20=20checking=20pg_constraint=20{connamespace}=20=3D>=20= pg_namespace=20{oid}=0A=20NOTICE:=20=20checking=20pg_constraint=20= {conrelid}=20=3D>=20pg_class=20{oid}=0A=20NOTICE:=20=20checking=20= pg_constraint=20{contypid}=20=3D>=20pg_type=20{oid}=0Adiff=20--git=20= a/src/test/regress/expected/privileges.out=20= b/src/test/regress/expected/privileges.out=0Aindex=20= 9b91865dcc..8574f6bc32=20100644=0A---=20= a/src/test/regress/expected/privileges.out=0A+++=20= b/src/test/regress/expected/privileges.out=0A@@=20-31,6=20+31,24=20@@=20= CREATE=20USER=20regress_priv_user6;=0A=20CREATE=20USER=20= regress_priv_user7;=0A=20GRANT=20pg_read_all_data=20TO=20= regress_priv_user6;=0A=20GRANT=20pg_write_all_data=20TO=20= regress_priv_user7;=0A+GRANT=20SET=20VALUE=20ON=20enable_memoize=20TO=20= regress_priv_user6;=0A+GRANT=20SET=20VALUE=20ON=20enable_nestloop=20TO=20= regress_priv_user6;=0A+SET=20ROLE=20regress_priv_user6;=0A+SET=20= enable_memoize=20TO=20false;=0A+SET=20enable_nestloop=20TO=20false;=0A= +RESET=20enable_memoize;=0A+RESET=20enable_nestloop;=0A+RESET=20ROLE;=0A= +GRANT=20ALTER=20SYSTEM=20ON=20enable_seqscan=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20sort_mem=20TO=20= regress_priv_user7;=20--=20old=20name=20for=20"work_mem"=0A+GRANT=20= ALTER=20SYSTEM=20ON=20maintenance_work_mem=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20no_such_param=20TO=20= regress_priv_user7;=20--=20does=20not=20exist=0A+ERROR:=20=20= configuration=20parameter=20"no_such_param"=20does=20not=20exist=0A= +GRANT=20SELECT=20ON=20public.persons2=20TO=20regress_priv_user7;=0A+SET=20= ROLE=20regress_priv_user7;=0A+ALTER=20SYSTEM=20SET=20enable_seqscan=20=3D=20= OFF;=0A+ALTER=20SYSTEM=20RESET=20enable_seqscan;=0A+RESET=20ROLE;=0A=20= CREATE=20GROUP=20regress_priv_group1;=0A=20CREATE=20GROUP=20= regress_priv_group2=20WITH=20USER=20regress_priv_user1,=20= regress_priv_user2;=0A=20ALTER=20GROUP=20regress_priv_group1=20ADD=20= USER=20regress_priv_user4;=0A@@=20-2326,10=20+2344,28=20@@=20DROP=20USER=20= regress_priv_user2;=0A=20DROP=20USER=20regress_priv_user3;=0A=20DROP=20= USER=20regress_priv_user4;=0A=20DROP=20USER=20regress_priv_user5;=0A= -DROP=20USER=20regress_priv_user6;=0A-DROP=20USER=20regress_priv_user7;=0A= +DROP=20USER=20regress_priv_user6;=20--=20privileges=20remain=0A+ERROR:=20= =20role=20"regress_priv_user6"=20cannot=20be=20dropped=20because=20some=20= objects=20depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20= configuration=20parameter=20enable_memoize=0A+privileges=20for=20= configuration=20parameter=20enable_nestloop=0A+DROP=20USER=20= regress_priv_user7;=20--=20privileges=20remain=0A+ERROR:=20=20role=20= "regress_priv_user7"=20cannot=20be=20dropped=20because=20some=20objects=20= depend=20on=20it=0A+DETAIL:=20=20privileges=20for=20configuration=20= parameter=20enable_seqscan=0A+privileges=20for=20configuration=20= parameter=20maintenance_work_mem=0A+privileges=20for=20configuration=20= parameter=20work_mem=0A+privileges=20for=20table=20persons2=0A=20DROP=20= USER=20regress_priv_user8;=20--=20does=20not=20exist=0A=20ERROR:=20=20= role=20"regress_priv_user8"=20does=20not=20exist=0A+REVOKE=20SELECT=20ON=20= public.persons2=20FROM=20regress_priv_user7;=0A+REVOKE=20ALTER=20SYSTEM=20= ON=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20ok=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20work_mem=20FROM=20regress_priv_user7;=20--=20ok,=20= use=20new=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20vacuum_mem=20FROM=20= regress_priv_user7;=20--=20ok,=20use=20old=20name=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20no_such_param=20FROM=20regress_priv_user7;=20--=20does=20= not=20exist=0A+ERROR:=20=20configuration=20parameter=20"no_such_param"=20= does=20not=20exist=0A+DROP=20USER=20regress_priv_user7;=20--=20ok=0A= +REVOKE=20SET=20VALUE=20ON=20enable_memoize=20FROM=20regress_priv_user6;=0A= +REVOKE=20SET=20VALUE=20ON=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/sanity_check.out=20= b/src/test/regress/expected/sanity_check.out=0Aindex=20= d04dc66db9..308c25daff=20100644=0A---=20= a/src/test/regress/expected/sanity_check.out=0A+++=20= b/src/test/regress/expected/sanity_check.out=0A@@=20-113,6=20+113,7=20@@=20= pg_authid|t=0A=20pg_cast|t=0A=20pg_class|t=0A=20pg_collation|t=0A= +pg_config_param|t=0A=20pg_constraint|t=0A=20pg_conversion|t=0A=20= pg_database|t=0Adiff=20--git=20a/src/test/regress/parallel_schedule=20= b/src/test/regress/parallel_schedule=0Aindex=20017e962fed..b45a203eb6=20= 100644=0A---=20a/src/test/regress/parallel_schedule=0A+++=20= b/src/test/regress/parallel_schedule=0A@@=20-86,7=20+86,7=20@@=20test:=20= brin_bloom=20brin_multi=0A=20#=20----------=0A=20#=20Another=20group=20= of=20parallel=20tests=0A=20#=20----------=0A-test:=20create_table_like=20= alter_generic=20alter_operator=20misc=20async=20dbsize=20misc_functions=20= sysviews=20tsrf=20tid=20tidscan=20tidrangescan=20collate.icu.utf8=20= incremental_sort=0A+test:=20create_table_like=20alter_generic=20= alter_operator=20misc=20async=20dbsize=20misc_functions=20sysviews=20= tsrf=20tid=20tidscan=20tidrangescan=20collate.icu.utf8=20= incremental_sort=20guc_privs=0A=20=0A=20#=20rules=20cannot=20run=20= concurrently=20with=20any=20test=20that=20creates=0A=20#=20a=20view=20or=20= rule=20in=20the=20public=20schema=0Adiff=20--git=20= a/src/test/regress/sql/guc_privs.sql=20= b/src/test/regress/sql/guc_privs.sql=0Anew=20file=20mode=20100644=0A= index=200000000000..0456517274=0A---=20/dev/null=0A+++=20= b/src/test/regress/sql/guc_privs.sql=0A@@=20-0,0=20+1,106=20@@=0A+--=20= Test=20superuser=0A+--=20Superuser=20DBA=0A+CREATE=20ROLE=20= regress_admin=20SUPERUSER;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_admin;=0A+--=20PGC_BACKEND=0A+SET=20ignore_system_indexes=20=3D=20= OFF;=20=20--=20fail,=20cannot=20be=20set=20after=20connection=20start=0A= +RESET=20ignore_system_indexes;=20=20--=20fail,=20cannot=20be=20set=20= after=20connection=20start=0A+ALTER=20SYSTEM=20SET=20= ignore_system_indexes=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20ignore_system_indexes;=20=20--=20ok=0A+--=20PGC_INTERNAL=0A+SET=20= block_size=20=3D=2050;=20=20--=20fail,=20cannot=20be=20changed=0A+RESET=20= block_size;=20=20--=20fail,=20cannot=20be=20changed=0A+ALTER=20SYSTEM=20= SET=20block_size=20=3D=2050;=20=20--=20fail,=20cannot=20be=20changed=0A= +ALTER=20SYSTEM=20RESET=20block_size;=20=20--=20fail,=20cannot=20be=20= changed=0A+--=20PGC_POSTMASTER=0A+SET=20autovacuum_freeze_max_age=20=3D=20= 1000050000;=20=20--=20fail,=20requires=20restart=0A+RESET=20= autovacuum_freeze_max_age;=20=20--=20fail,=20requires=20restart=0A+ALTER=20= SYSTEM=20SET=20autovacuum_freeze_max_age=20=3D=201000050000;=20=20--=20= ok=0A+ALTER=20SYSTEM=20RESET=20autovacuum_freeze_max_age;=20=20--=20ok=0A= +ALTER=20SYSTEM=20SET=20config_file=20=3D=20= '/usr/local/data/postgresql.conf';=20=20--=20fail,=20cannot=20be=20= changed=0A+ALTER=20SYSTEM=20RESET=20config_file;=20=20--=20fail,=20= cannot=20be=20changed=0A+--=20PGC_SIGHUP=0A+SET=20autovacuum=20=3D=20= OFF;=20=20--=20fail,=20requires=20reload=0A+RESET=20autovacuum;=20=20--=20= fail,=20requires=20reload=0A+ALTER=20SYSTEM=20SET=20autovacuum=20=3D=20= OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20autovacuum;=20=20--=20ok=0A= +--=20PGC_SUSET=0A+SET=20lc_messages=20=3D=20'en_US.UTF-8';=20=20--=20ok=0A= +RESET=20lc_messages;=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20lc_messages=20= =3D=20'en_US.UTF-8';=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20= lc_messages;=20=20--=20ok=0A+--=20PGC_SU_BACKEND=0A+SET=20= jit_debugging_support=20=3D=20OFF;=20=20--=20fail,=20cannot=20be=20set=20= after=20connection=20start=0A+RESET=20jit_debugging_support;=20=20--=20= fail,=20cannot=20be=20set=20after=20connection=20start=0A+ALTER=20SYSTEM=20= SET=20jit_debugging_support=20=3D=20OFF;=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20jit_debugging_support;=20=20--=20ok=0A+--=20PGC_USERSET=0A+SET=20= DateStyle=20=3D=20'ISO,=20MDY';=20=20--=20ok=0A+RESET=20DateStyle;=20=20= --=20ok=0A+ALTER=20SYSTEM=20SET=20DateStyle=20=3D=20'ISO,=20MDY';=20=20= --=20ok=0A+ALTER=20SYSTEM=20RESET=20DateStyle;=20=20--=20ok=0A+ALTER=20= SYSTEM=20SET=20ssl_renegotiation_limit=20=3D=200;=20=20--=20fail,=20= cannot=20be=20changed=0A+ALTER=20SYSTEM=20RESET=20= ssl_renegotiation_limit;=20=20--=20fail,=20cannot=20be=20changed=0A+--=20= Finished=20testing=20superuser=0A+RESET=20statement_timeout;=0A+RESET=20= SESSION=20AUTHORIZATION;=0A+DROP=20ROLE=20regress_admin;=0A+--=20Create=20= non-superuser=20with=20privileges=20to=20configure=20host=20resource=20= usage=0A+CREATE=20ROLE=20regress_host_resource_admin=20NOSUPERUSER;=0A= +GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09autovacuum_work_mem,=20= hash_mem_multiplier,=20logical_decoding_work_mem,=0A+=09= maintenance_work_mem,=20max_stack_depth,=20min_dynamic_shared_memory,=0A= +=09shared_buffers,=20temp_buffers,=20temp_file_limit,=20work_mem=0A+TO=20= regress_host_resource_admin;=0A+--=20Perform=20all=20operations=20as=20= user=20'regress_host_resource_admin'=20--=0A+SET=20SESSION=20= AUTHORIZATION=20regress_host_resource_admin;=0A+ALTER=20SYSTEM=20SET=20= 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+RESET=20= TimeZone;=20=20--=20ok=0A+RESET=20SESSION=20AUTHORIZATION;=0A+DROP=20= ROLE=20regress_host_resource_admin;=20=20--=20fail,=20privileges=20= remain=0A+REVOKE=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=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+FROM=20regress_host_resource_admin;=0A= +DROP=20ROLE=20regress_host_resource_admin;=20=20--=20ok=0A+--=20Create=20= non-superuser=20with=20privileges=20to=20configure=20plgsql=20custom=20= variables=0A+CREATE=20ROLE=20regress_plpgsql_admin=20NOSUPERUSER;=0A+--=20= Perform=20all=20operations=20as=20user=20'regress_plpgsql_admin'=20--=0A= +SET=20SESSION=20AUTHORIZATION=20regress_plpgsql_admin;=0A+SET=20= plpgsql.extra_errors=20TO=20'all';=0A+SET=20plpgsql.extra_warnings=20TO=20= 'all';=0A+RESET=20plpgsql.extra_errors;=0A+RESET=20= plpgsql.extra_warnings;=0A+ALTER=20SYSTEM=20SET=20plpgsql.extra_errors=20= TO=20'all';=0A+ALTER=20SYSTEM=20SET=20plpgsql.extra_warnings=20TO=20= 'all';=0A+ALTER=20SYSTEM=20RESET=20plpgsql.extra_errors;=0A+ALTER=20= SYSTEM=20RESET=20plpgsql.extra_warnings;=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+GRANT=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09= plpgsql.extra_warnings,=20plpgsql.extra_errors=0A+TO=20= regress_plpgsql_admin;=0A+--=20Perform=20all=20operations=20as=20user=20= 'regress_plpgsql_admin'=20--=0A+SET=20SESSION=20AUTHORIZATION=20= regress_plpgsql_admin;=20=20--=20ok=0A+SET=20plpgsql.extra_errors=20TO=20= 'all';=20=20--=20ok=0A+SET=20plpgsql.extra_warnings=20TO=20'all';=20=20= --=20ok=0A+RESET=20plpgsql.extra_errors;=20=20--=20ok=0A+RESET=20= plpgsql.extra_warnings;=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20= plpgsql.extra_errors=20TO=20'all';=20=20--=20ok=0A+ALTER=20SYSTEM=20SET=20= plpgsql.extra_warnings=20TO=20'all';=20=20--=20ok=0A+ALTER=20SYSTEM=20= RESET=20plpgsql.extra_errors;=20=20--=20ok=0A+ALTER=20SYSTEM=20RESET=20= plpgsql.extra_warnings;=20=20--=20ok=0A+RESET=20SESSION=20AUTHORIZATION;=0A= +DROP=20ROLE=20regress_plpgsql_admin;=20=20--=20fail,=20privileges=20= remain=0A+REVOKE=20SET=20VALUE,=20ALTER=20SYSTEM=20ON=0A+=09= plpgsql.extra_warnings,=20plpgsql.extra_errors=0A+FROM=20= regress_plpgsql_admin;=0A+DROP=20ROLE=20regress_plpgsql_admin;=20=20--=20= ok=0Adiff=20--git=20a/src/test/regress/sql/privileges.sql=20= b/src/test/regress/sql/privileges.sql=0Aindex=206353a1cb8c..11f41032f2=20= 100644=0A---=20a/src/test/regress/sql/privileges.sql=0A+++=20= b/src/test/regress/sql/privileges.sql=0A@@=20-36,6=20+36,27=20@@=20= CREATE=20USER=20regress_priv_user7;=0A=20GRANT=20pg_read_all_data=20TO=20= regress_priv_user6;=0A=20GRANT=20pg_write_all_data=20TO=20= regress_priv_user7;=0A=20=0A+GRANT=20SET=20VALUE=20ON=20enable_memoize=20= TO=20regress_priv_user6;=0A+GRANT=20SET=20VALUE=20ON=20enable_nestloop=20= TO=20regress_priv_user6;=0A+=0A+SET=20ROLE=20regress_priv_user6;=0A+SET=20= enable_memoize=20TO=20false;=0A+SET=20enable_nestloop=20TO=20false;=0A= +RESET=20enable_memoize;=0A+RESET=20enable_nestloop;=0A+RESET=20ROLE;=0A= +=0A+GRANT=20ALTER=20SYSTEM=20ON=20enable_seqscan=20TO=20= regress_priv_user7;=20--=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20sort_mem=20= TO=20regress_priv_user7;=20--=20old=20name=20for=20"work_mem"=0A+GRANT=20= ALTER=20SYSTEM=20ON=20maintenance_work_mem=20TO=20regress_priv_user7;=20= --=20ok=0A+GRANT=20ALTER=20SYSTEM=20ON=20no_such_param=20TO=20= regress_priv_user7;=20--=20does=20not=20exist=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-1389,10=20+1410,22=20@@=20DROP=20USER=20= regress_priv_user2;=0A=20DROP=20USER=20regress_priv_user3;=0A=20DROP=20= USER=20regress_priv_user4;=0A=20DROP=20USER=20regress_priv_user5;=0A= -DROP=20USER=20regress_priv_user6;=0A-DROP=20USER=20regress_priv_user7;=0A= +DROP=20USER=20regress_priv_user6;=20--=20privileges=20remain=0A+DROP=20= USER=20regress_priv_user7;=20--=20privileges=20remain=0A=20DROP=20USER=20= regress_priv_user8;=20--=20does=20not=20exist=0A=20=0A+REVOKE=20SELECT=20= ON=20public.persons2=20FROM=20regress_priv_user7;=0A+REVOKE=20ALTER=20= SYSTEM=20ON=20enable_seqscan=20FROM=20regress_priv_user7;=20--=20ok=0A= +REVOKE=20ALTER=20SYSTEM=20ON=20work_mem=20FROM=20regress_priv_user7;=20= --=20ok,=20use=20new=20name=0A+REVOKE=20ALTER=20SYSTEM=20ON=20vacuum_mem=20= FROM=20regress_priv_user7;=20--=20ok,=20use=20old=20name=0A+REVOKE=20= ALTER=20SYSTEM=20ON=20no_such_param=20FROM=20regress_priv_user7;=20--=20= does=20not=20exist=0A+=0A+DROP=20USER=20regress_priv_user7;=20--=20ok=0A= +=0A+REVOKE=20SET=20VALUE=20ON=20enable_memoize=20FROM=20= regress_priv_user6;=0A+REVOKE=20SET=20VALUE=20ON=20enable_nestloop=20= FROM=20regress_priv_user6;=0A+=0A+DROP=20USER=20regress_priv_user6;=20--=20= ok=0A=20=0A=20--=20permissions=20with=20LOCK=20TABLE=0A=20CREATE=20USER=20= regress_locktable_user;=0Adiff=20--git=20= a/src/tools/pgindent/typedefs.list=20b/src/tools/pgindent/typedefs.list=0A= index=20da6ac8ed83..a1ee568b61=20100644=0A---=20= a/src/tools/pgindent/typedefs.list=0A+++=20= b/src/tools/pgindent/typedefs.list=0A@@=20-459,6=20+459,7=20@@=20= CoverExt=0A=20CoverPos=0A=20CreateAmStmt=0A=20CreateCastStmt=0A= +CreateConfigParamStmt=0A=20CreateConversionStmt=0A=20CreateDomainStmt=0A= =20CreateEnumStmt=0A--=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_9F3716BE-6593-4BD1-BF4B-42A0488E8164 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 [1] = https://www.postgresql.org/message-id/flat/F9408A5A-B20B-42D2-9E7F-49CD3D1= 547BC%40enterprisedb.com [2] = https://www.postgresql.org/message-id/flat/0BE45772-31CF-4BE9-9FE8-FB7D8B1= 30240%40enterprisedb.com =E2=80=94 Mark Dilger EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --Apple-Mail=_9F3716BE-6593-4BD1-BF4B-42A0488E8164--