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 1nV3Bo-0003JL-43 for pgsql-hackers@arkaria.postgresql.org; Fri, 18 Mar 2022 03:22:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nV3Bm-00014W-W1 for pgsql-hackers@arkaria.postgresql.org; Fri, 18 Mar 2022 03:22:07 +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 1nV3Bm-00014M-4r for pgsql-hackers@lists.postgresql.org; Fri, 18 Mar 2022 03:22:06 +0000 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nV3Bh-00089T-BL for pgsql-hackers@postgresql.org; Fri, 18 Mar 2022 03:22:05 +0000 Received: by mail-pl1-x636.google.com with SMTP id w4so6010396ply.13 for ; Thu, 17 Mar 2022 20:22:00 -0700 (PDT) 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=TvE8HvxdB8crDM7BQOjLyVxQBtnZi9Q6QHynMej2yao=; b=h6ROhAFVTbIO/rCaGZLEQgKOStZtClQaDtCnKWFdCnwl7EUdU6Coe3NGNvNb+UKJbc ixZsYkqVP23YKVZBn5Htwl73yCPV+IuQMT3M3b6/Y8Q/kdJurBRN8SWXwKSCMSsTYCdm Z81+5Tje43vs0S/GsvvfCy8kr4SdKf5g8xf3/0F7aOQRCz0DAGjvpr5l0dhZXHst9DRj U34RmlJ5tW1qt5Iwsd7b92OYJm1iTUF3oDPrWQrBQqKgwpwHavtLA9Y+xbiV0nHC4nv3 ECp+UoaIAfSWUwpdf/Fp4QXsQJlTSFQ13NDUdfYGG3RhK5+Qbef6w/lulxlENmFDixOI /YxQ== 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=TvE8HvxdB8crDM7BQOjLyVxQBtnZi9Q6QHynMej2yao=; b=V4hd/vktNqoHKiDfcELfhzpa2QHWiFgWRRp+pgqhkdlpG2X4YwazjoRoRDhX5jOwd8 dKjfgmICOo+LdUCWMXWSOVRGYx5DBlZdGEMP5NrS6YS43LOe3u/GrrrjMHd5vHElOtsI oh9opALz/JbvQ2TVSjmVWrMZcHk1gyN2qtE/yyTtwP+A/RP9pxit6zeiVGH3PctuowRm wcmBAjtUwkWa7Ad0sfiuA4FosYSS8r/gg2C3J7s6+EMOMKwtybtDJqgboS6cAJJwfhA8 m8v0s5Vsg1584ZIzaMLZ69g3GtqNjeEXtYIQ9Yrt1sGAnrrIOcYTfYi9Pbc1TjLeKNaQ PXew== X-Gm-Message-State: AOAM531CukxcwAqDTfFCzgubPZcIaNWyS2jaTTSqMETXX2l2BUCugLdq e+nnChUaofvm2XguUZ75Dg7iQQkfTzVu0yKz2FKeMu/NjPms2n+CPqNQYg1P8PgXaTkr5wVjmQM uSRqWsDYnhTpakSwyvVHpCQ6KNsZyA5kF0/4MSk94TjD5Cv9OWQWQlLYTKOUVYtQljIRzZqEppV rwWLvVVEZrcpWbhT98/SOZL0TlAgmeMAZ5kAML9mu3LPzNETWJAbsLmtBcUVfbX14v+hB/obU0q PkSmggPojUKZlPzELNhtqYHY7Z914mj3ZFf X-Google-Smtp-Source: ABdhPJyHK8e0VBZiCPij7lwyU+Dsf7wrzE+/U2hn7VcQvSUeCxKt+VbqAuvWzIqLbx8T4yeZSaDHFA== X-Received: by 2002:a17:902:9a4b:b0:14f:fe0b:5546 with SMTP id x11-20020a1709029a4b00b0014ffe0b5546mr7986695plv.46.1647573718597; Thu, 17 Mar 2022 20:21:58 -0700 (PDT) Received: from laptop280-ma-us.hitronhub.home (24-113-193-150.wavecable.com. [24.113.193.150]) by smtp.gmail.com with ESMTPSA id o7-20020a63f147000000b00373facf1083sm6621676pgk.57.2022.03.17.20.21.57 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 Mar 2022 20:21:58 -0700 (PDT) From: Mark Dilger Content-Type: multipart/mixed; boundary="Apple-Mail=_5543C7F7-6C54-42F8-AAB2-9D6FA63CFD16" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: New Object Access Type hooks Message-Id: <47F87A0E-C0E5-43A6-89F6-D403F2B45175@enterprisedb.com> Date: Thu, 17 Mar 2022 20:21:56 -0700 Cc: Robert Haas , Tom Lane , Andrew Dunstan , Jeff Davis , Joe Conway To: PostgreSQL-development , Joshua Brindle 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=_5543C7F7-6C54-42F8-AAB2-9D6FA63CFD16 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hackers, Over in [1], Joshua proposed a new set of Object Access Type hooks based = on strings rather than Oids. His patch was written to be applied atop my patch for granting = privileges on gucs. On review of his patch, I became uncomfortable with the complete lack of = regression test coverage. To be fair, he did paste a bit of testing = logic to the thread, but it appears to be based on pgaudit, and it is = unclear how to include such a test in the core project, where pgaudit is = not assumed to be installed. First, I refactored his patch to work against HEAD and not depend on my = GUCs patch. Find that as v1-0001. The refactoring exposed a bit of a = problem. To call the new hook for SET and ALTER SYSTEM commands, I need = to pass in the Oid of a catalog table. But since my GUC patch isn't = applied yet, there isn't any such table (pg_setting_acl or whatnot) to = pass. So I'm passing InvalidOid, but I don't know if that is right. In = any event, if we want a new API like this, we should think a bit harder = about whether it can be used to check operations where no table Oid is = applicable. Second, I added a new test directory, src/test/modules/test_oat_hooks, = which includes a new loadable module with hook implementations and a = regression test for testing the object access hooks. The main point of = the test is to log which hooks get called in which order, and which = hooks do or do not get called when other hooks allow or deny access. = That information shows up in the expected output as NOTICE messages. This second patch has gotten a little long, and I'd like another pair of = eyes on this before spending a second day on the effort. Please note = that this is a quick WIP patch in response to the patch Joshua posted = earlier today. Sorry for sometimes missing function comments, etc. The = goal, if this design seems acceptable, is to polish this, hopefully with = Joshua's assistance, and get it committed *before* my GUCs patch, so = that my patch can be rebased to use it. Otherwise, if this is rejected, = I can continue on the GUC patch without this. (FYI, I got a test failure from src/test/recovery/t/013_crash_restart.pl = when testing v1-0001. I'm not sure yet what that is about.) --Apple-Mail=_5543C7F7-6C54-42F8-AAB2-9D6FA63CFD16 Content-Disposition: attachment; filename=v1-0001-Add-String-object-access-hooks.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1-0001-Add-String-object-access-hooks.patch" Content-Transfer-Encoding: quoted-printable =46rom=20f994037f851a8cff27c492433dd37030f6c5e15d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Mark=20Dilger=20=0A= Date:=20Thu,=2017=20Mar=202022=2019:30:09=20-0700=0ASubject:=20[PATCH=20= v1=201/2]=20Add=20String=20object=20access=20hooks=0A=0AThe=20first=20= user=20of=20these=20will=20be=20the=20GUC=20access=20controls=0A=0A= Written=20by=20Joshua=20Brindle;=20refactored=20by=20Mark=20Dilger=0A---=0A= =20src/backend/catalog/objectaccess.c=20|=20128=20= +++++++++++++++++++++++++++++=0A=20src/backend/utils/misc/guc.c=20=20=20=20= =20=20=20|=20=2017=20++++=0A=20src/include/catalog/objectaccess.h=20|=20=20= 70=20+++++++++++++++-=0A=20src/include/nodes/parsenodes.h=20=20=20=20=20= |=20=20=204=20+-=0A=20src/include/utils/acl.h=20=20=20=20=20=20=20=20=20=20= =20=20|=20=20=204=20+-=0A=205=20files=20changed,=20220=20insertions(+),=20= 3=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/catalog/objectaccess.c=20= b/src/backend/catalog/objectaccess.c=0Aindex=20549fac4539..72ad6e9a90=20= 100644=0A---=20a/src/backend/catalog/objectaccess.c=0A+++=20= b/src/backend/catalog/objectaccess.c=0A@@=20-20,6=20+20,8=20@@=0A=20=20*=20= and=20logging=20plugins.=0A=20=20*/=0A=20object_access_hook_type=20= object_access_hook=20=3D=20NULL;=0A+object_access_hook_type_str=20= object_access_hook_str=20=3D=20NULL;=0A+=0A=20=0A=20/*=0A=20=20*=20= RunObjectPostCreateHook=0A@@=20-143,3=20+145,129=20@@=20= RunFunctionExecuteHook(Oid=20objectId)=0A=20=09=09=09=09=09=09=20=20=20= ProcedureRelationId,=20objectId,=200,=0A=20=09=09=09=09=09=09=20=20=20= NULL);=0A=20}=0A+=0A+/*=20String=20versions=20*/=0A+=0A+=0A+/*=0A+=20*=20= RunObjectPostCreateHook=0A+=20*=0A+=20*=20It=20is=20entrypoint=20of=20= OAT_POST_CREATE=20event=0A+=20*/=0A+void=0A= +RunObjectPostCreateHookStr(Oid=20classId,=20const=20char=20*objectName,=20= int=20subId,=0A+=09=09=09=09=09=09bool=20is_internal)=0A+{=0A+=09= ObjectAccessPostCreate=20pc_arg;=0A+=0A+=09/*=20caller=20should=20check,=20= but=20just=20in=20case...=20*/=0A+=09Assert(object_access_hook_str=20!=3D=20= NULL);=0A+=0A+=09memset(&pc_arg,=200,=20sizeof(ObjectAccessPostCreate));=0A= +=09pc_arg.is_internal=20=3D=20is_internal;=0A+=0A+=09= (*object_access_hook_str)=20(OAT_POST_CREATE,=0A+=09=09=09=09=09=09=20=20= =20classId,=20objectName,=20subId,=0A+=09=09=09=09=09=09=20=20=20(void=20= *)=20&pc_arg);=0A+}=0A+=0A+/*=0A+=20*=20RunObjectDropHook=0A+=20*=0A+=20= *=20It=20is=20entrypoint=20of=20OAT_DROP=20event=0A+=20*/=0A+void=0A= +RunObjectDropHookStr(Oid=20classId,=20const=20char=20*objectName,=20int=20= subId,=0A+=09=09=09=09=20=20int=20dropflags)=0A+{=0A+=09ObjectAccessDrop=20= drop_arg;=0A+=0A+=09/*=20caller=20should=20check,=20but=20just=20in=20= case...=20*/=0A+=09Assert(object_access_hook_str=20!=3D=20NULL);=0A+=0A+=09= memset(&drop_arg,=200,=20sizeof(ObjectAccessDrop));=0A+=09= drop_arg.dropflags=20=3D=20dropflags;=0A+=0A+=09= (*object_access_hook_str)=20(OAT_DROP,=0A+=09=09=09=09=09=09=20=20=20= classId,=20objectName,=20subId,=0A+=09=09=09=09=09=09=20=20=20(void=20*)=20= &drop_arg);=0A+}=0A+=0A+/*=0A+=20*=20RunObjectTruncateHook=0A+=20*=0A+=20= *=20It=20is=20the=20entrypoint=20of=20OAT_TRUNCATE=20event=0A+=20*/=0A= +void=0A+RunObjectTruncateHookStr(const=20char=20*objectName)=0A+{=0A+=09= /*=20caller=20should=20check,=20but=20just=20in=20case...=20*/=0A+=09= Assert(object_access_hook_str=20!=3D=20NULL);=0A+=0A+=09= (*object_access_hook_str)=20(OAT_TRUNCATE,=0A+=09=09=09=09=09=09=20=20=20= RelationRelationId,=20objectName,=200,=0A+=09=09=09=09=09=09=20=20=20= NULL);=0A+}=0A+=0A+/*=0A+=20*=20RunObjectPostAlterHook=0A+=20*=0A+=20*=20= It=20is=20entrypoint=20of=20OAT_POST_ALTER=20event=0A+=20*/=0A+void=0A= +RunObjectPostAlterHookStr(Oid=20classId,=20const=20char=20*objectName,=20= int=20subId,=0A+=09=09=09=09=09=20=20=20Oid=20auxiliaryId,=20bool=20= is_internal)=0A+{=0A+=09ObjectAccessPostAlter=20pa_arg;=0A+=0A+=09/*=20= caller=20should=20check,=20but=20just=20in=20case...=20*/=0A+=09= Assert(object_access_hook_str=20!=3D=20NULL);=0A+=0A+=09memset(&pa_arg,=20= 0,=20sizeof(ObjectAccessPostAlter));=0A+=09pa_arg.auxiliary_id=20=3D=20= auxiliaryId;=0A+=09pa_arg.is_internal=20=3D=20is_internal;=0A+=0A+=09= (*object_access_hook_str)=20(OAT_POST_ALTER,=0A+=09=09=09=09=09=09=20=20=20= classId,=20objectName,=20subId,=0A+=09=09=09=09=09=09=20=20=20(void=20*)=20= &pa_arg);=0A+}=0A+=0A+/*=0A+=20*=20RunNamespaceSearchHook=0A+=20*=0A+=20= *=20It=20is=20entrypoint=20of=20OAT_NAMESPACE_SEARCH=20event=0A+=20*/=0A= +bool=0A+RunNamespaceSearchHookStr(const=20char=20*objectName,=20bool=20= ereport_on_violation)=0A+{=0A+=09ObjectAccessNamespaceSearch=20ns_arg;=0A= +=0A+=09/*=20caller=20should=20check,=20but=20just=20in=20case...=20*/=0A= +=09Assert(object_access_hook_str=20!=3D=20NULL);=0A+=0A+=09= memset(&ns_arg,=200,=20sizeof(ObjectAccessNamespaceSearch));=0A+=09= ns_arg.ereport_on_violation=20=3D=20ereport_on_violation;=0A+=09= ns_arg.result=20=3D=20true;=0A+=0A+=09(*object_access_hook_str)=20= (OAT_NAMESPACE_SEARCH,=0A+=09=09=09=09=09=09=20=20=20= NamespaceRelationId,=20objectName,=200,=0A+=09=09=09=09=09=09=20=20=20= (void=20*)=20&ns_arg);=0A+=0A+=09return=20ns_arg.result;=0A+}=0A+=0A+/*=0A= +=20*=20RunFunctionExecuteHook=0A+=20*=0A+=20*=20It=20is=20entrypoint=20= of=20OAT_FUNCTION_EXECUTE=20event=0A+=20*/=0A+void=0A= +RunFunctionExecuteHookStr(const=20char=20*objectName)=0A+{=0A+=09/*=20= caller=20should=20check,=20but=20just=20in=20case...=20*/=0A+=09= Assert(object_access_hook_str=20!=3D=20NULL);=0A+=0A+=09= (*object_access_hook_str)=20(OAT_FUNCTION_EXECUTE,=0A+=09=09=09=09=09=09=20= =20=20ProcedureRelationId,=20objectName,=200,=0A+=09=09=09=09=09=09=20=20= =20NULL);=0A+}=0Adiff=20--git=20a/src/backend/utils/misc/guc.c=20= b/src/backend/utils/misc/guc.c=0Aindex=20e7f0a380e6..932aefc777=20100644=0A= ---=20a/src/backend/utils/misc/guc.c=0A+++=20= b/src/backend/utils/misc/guc.c=0A@@=20-43,6=20+43,7=20@@=0A=20#include=20= "access/xlog_internal.h"=0A=20#include=20"access/xlogrecovery.h"=0A=20= #include=20"catalog/namespace.h"=0A+#include=20"catalog/objectaccess.h"=0A= =20#include=20"catalog/pg_authid.h"=0A=20#include=20"catalog/storage.h"=0A= =20#include=20"commands/async.h"=0A@@=20-8736,6=20+8737,18=20@@=20= AlterSystemSetConfigFile(AlterSystemStmt=20*altersysstmt)=0A=20=09=09= replace_auto_config_value(&head,=20&tail,=20name,=20value);=0A=20=09}=0A=20= =0A+=09/*=0A+=09=20*=20Invoke=20the=20post-alter=20hook=20for=20altering=20= this=20GUC=20variable.=0A+=09=20*=0A+=09=20*=20We=20do=20this=20here=20= rather=20than=20at=20the=20end,=20because=20ALTER=20SYSTEM=20is=20not=0A= +=09=20*=20transactional.=20=20If=20the=20hook=20aborts=20our=20= transaction,=20it=20will=20be=20cleaner=0A+=09=20*=20to=20do=20so=20= before=20we=20touch=20any=20files.=0A+=09=20*/=0A+=09= InvokeObjectPostAlterHookArgStr(InvalidOid,=20name,=0A+=09=09=09=09=09=09= =09=09=09ACL_ALTER_SYSTEM,=0A+=09=09=09=09=09=09=09=09=09= altersysstmt->setstmt->kind,=0A+=09=09=09=09=09=09=09=09=09false);=0A+=0A= =20=09/*=0A=20=09=20*=20To=20ensure=20crash=20safety,=20first=20write=20= the=20new=20file=20data=20to=20a=20temp=20file,=0A=20=09=20*=20then=20= atomically=20rename=20it=20into=20place.=0A@@=20-8907,6=20+8920,10=20@@=20= ExecSetVariableStmt(VariableSetStmt=20*stmt,=20bool=20isTopLevel)=0A=20=09= =09=09ResetAllOptions();=0A=20=09=09=09break;=0A=20=09}=0A+=0A+=09/*=20= Invoke=20the=20post-alter=20hook=20for=20setting=20this=20GUC=20= variable.=20*/=0A+=09InvokeObjectPostAlterHookArgStr(InvalidOid,=20= stmt->name,=0A+=09=09=09=09=09=09=09=09=09ACL_SET_VALUE,=20stmt->kind,=20= false);=0A=20}=0A=20=0A=20/*=0Adiff=20--git=20= a/src/include/catalog/objectaccess.h=20= b/src/include/catalog/objectaccess.h=0Aindex=20508dfd0a6b..4d54ae2a7d=20= 100644=0A---=20a/src/include/catalog/objectaccess.h=0A+++=20= b/src/include/catalog/objectaccess.h=0A@@=20-121,15=20+121,23=20@@=20= typedef=20struct=0A=20=09bool=09=09result;=0A=20}=20= ObjectAccessNamespaceSearch;=0A=20=0A-/*=20Plugin=20provides=20a=20hook=20= function=20matching=20this=20signature.=20*/=0A+/*=20Plugin=20provides=20= a=20hook=20function=20matching=20one=20or=20both=20of=20these=20= signatures.=20*/=0A=20typedef=20void=20(*object_access_hook_type)=20= (ObjectAccessType=20access,=0A=20=09=09=09=09=09=09=09=09=09=09=20Oid=20= classId,=0A=20=09=09=09=09=09=09=09=09=09=09=20Oid=20objectId,=0A=20=09=09= =09=09=09=09=09=09=09=09=20int=20subId,=0A=20=09=09=09=09=09=09=09=09=09=09= =20void=20*arg);=0A=20=0A+typedef=20void=20= (*object_access_hook_type_str)=20(ObjectAccessType=20access,=0A+=09=09=09= =09=09=09=09=09=09=09=20Oid=20classId,=0A+=09=09=09=09=09=09=09=09=09=09=20= const=20char=20*objectStr,=0A+=09=09=09=09=09=09=09=09=09=09=20int=20= subId,=0A+=09=09=09=09=09=09=09=09=09=09=20void=20*arg);=0A+=0A=20/*=20= Plugin=20sets=20this=20variable=20to=20a=20suitable=20hook=20function.=20= */=0A=20extern=20PGDLLIMPORT=20object_access_hook_type=20= object_access_hook;=0A+extern=20PGDLLIMPORT=20= object_access_hook_type_str=20object_access_hook_str;=0A+=0A=20=0A=20/*=20= Core=20code=20uses=20these=20functions=20to=20call=20the=20hook=20(see=20= macros=20below).=20*/=0A=20extern=20void=20RunObjectPostCreateHook(Oid=20= classId,=20Oid=20objectId,=20int=20subId,=0A@@=20-142,6=20+150,18=20@@=20= extern=20void=20RunObjectPostAlterHook(Oid=20classId,=20Oid=20objectId,=20= int=20subId,=0A=20extern=20bool=20RunNamespaceSearchHook(Oid=20objectId,=20= bool=20ereport_on_violation);=0A=20extern=20void=20= RunFunctionExecuteHook(Oid=20objectId);=0A=20=0A+/*=20String=20versions=20= */=0A+extern=20void=20RunObjectPostCreateHookStr(Oid=20classId,=20const=20= char=20*objectStr,=20int=20subId,=0A+=09=09=09=09=09=09=09=09=09bool=20= is_internal);=0A+extern=20void=20RunObjectDropHookStr(Oid=20classId,=20= const=20char=20*objectStr,=20int=20subId,=0A+=09=09=09=09=09=09=09=20=20= int=20dropflags);=0A+extern=20void=20RunObjectTruncateHookStr(const=20= char=20*objectStr);=0A+extern=20void=20RunObjectPostAlterHookStr(Oid=20= classId,=20const=20char=20*objectStr,=20int=20subId,=0A+=09=09=09=09=09=09= =09=09=20=20=20Oid=20auxiliaryId,=20bool=20is_internal);=0A+extern=20= bool=20RunNamespaceSearchHookStr(const=20char=20*objectStr,=20bool=20= ereport_on_violation);=0A+extern=20void=20= RunFunctionExecuteHookStr(const=20char=20*objectStr);=0A+=0A+=0A=20/*=0A=20= =20*=20The=20following=20macros=20are=20wrappers=20around=20the=20= functions=20above;=20these=20should=0A=20=20*=20normally=20be=20used=20= to=20invoke=20the=20hook=20in=20lieu=20of=20calling=20the=20above=20= functions=0A@@=20-194,4=20+214,52=20@@=20extern=20void=20= RunFunctionExecuteHook(Oid=20objectId);=0A=20=09=09=09= RunFunctionExecuteHook(objectId);=09\=0A=20=09}=20while(0)=0A=20=0A+=0A= +#define=20InvokeObjectPostCreateHookStr(classId,objectName,subId)=09=09=09= \=0A+=09= InvokeObjectPostCreateHookArgStr((classId),(objectName),(subId),false)=0A= +#define=20= InvokeObjectPostCreateHookArgStr(classId,objectName,subId,is_internal)=20= \=0A+=09do=20{=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09\=0A+=09=09if=20= (object_access_hook_str)=09=09=09=09=09=09=09=09=09=09\=0A+=09=09=09= RunObjectPostCreateHookStr((classId),(objectName),(subId),=09\=0A+=09=09=09= =09=09=09=09=09=09(is_internal));=09=09=09=09=09\=0A+=09}=20while(0)=0A+=0A= +#define=20InvokeObjectDropHookStr(classId,objectName,subId)=09=09=09=09= \=0A+=09InvokeObjectDropHookArgStr((classId),(objectName),(subId),0)=0A= +#define=20= InvokeObjectDropHookArgStr(classId,objectName,subId,dropflags)=09\=0A+=09= do=20{=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09\=0A+=09=09if=20= (object_access_hook_str)=09=09=09=09=09=09=09=09=09=09\=0A+=09=09=09= RunObjectDropHookStr((classId),(objectName),(subId),=09=09=09\=0A+=09=09=09= =09=09=09=09=20=20(dropflags));=09=09=09=09=09=09=09\=0A+=09}=20while(0)=0A= +=0A+#define=20InvokeObjectTruncateHookStr(objectName)=09=09=09=09=09=09=09= \=0A+=09do=20{=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09\=0A+=09=09if=20= (object_access_hook_str)=09=09=09=09=09=09=09=09=09=09\=0A+=09=09=09= RunObjectTruncateHookStr(objectName);=09=09=09=09=09=09\=0A+=09}=20= while(0)=0A+=0A+#define=20= InvokeObjectPostAlterHookStr(className,objectName,subId)=09=09=09\=0A+=09= InvokeObjectPostAlterHookArgStr((classId),(objectName),(subId),=09=09\=0A= +=09=09=09=09=09=09=09=09=20InvalidOid,false)=0A+#define=20= InvokeObjectPostAlterHookArgStr(classId,objectName,subId,=09=09\=0A+=09=09= =09=09=09=09=09=09=09=20auxiliaryId,is_internal)=09=09\=0A+=09do=20{=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09\=0A+=09=09if=20= (object_access_hook_str)=09=09=09=09=09=09=09=09=09=09\=0A+=09=09=09= RunObjectPostAlterHookStr((classId),(objectName),(subId),=09\=0A+=09=09=09= =09=09=09=09=09=20=20=20(auxiliaryId),(is_internal));=09\=0A+=09}=20= while(0)=0A+=0A+#define=20InvokeNamespaceSearchHookStr(objectName,=20= ereport_on_violation)=09\=0A+=09(!object_access_hook_str=09=09=09=09=09=09= =09=09=09=09\=0A+=09=20?=20true=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09\=0A+=09=20:=20RunNamespaceSearchHookStr((objectName),=20= (ereport_on_violation)))=0A+=0A+#define=20= InvokeFunctionExecuteHookStr(objectName)=09=09\=0A+=09do=20{=09=09=09=09=09= =09=09=09=09=09\=0A+=09=09if=20(object_access_hook_str)=09=09=09=09=09\=0A= +=09=09=09RunFunctionExecuteHookStr(objectName);=09\=0A+=09}=20while(0)=0A= +=0A+=0A=20#endif=09=09=09=09=09=09=09/*=20OBJECTACCESS_H=20*/=0Adiff=20= --git=20a/src/include/nodes/parsenodes.h=20= b/src/include/nodes/parsenodes.h=0Aindex=201617702d9d..dc361d62e2=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<=0A= Date:=20Thu,=2017=20Mar=202022=2015:05:18=20-0700=0ASubject:=20[PATCH=20= v1=202/2]=20Add=20regression=20tests=20of=20Object=20Access=20Type=20= hooks=0A=0A---=0A=20src/test/modules/Makefile=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=20= src/test/modules/test_oat_hooks/.gitignore=20=20=20=20|=20=20=204=20+=0A=20= src/test/modules/test_oat_hooks/Makefile=20=20=20=20=20=20|=20=2027=20+=0A= =20src/test/modules/test_oat_hooks/README=20=20=20=20=20=20=20=20|=20=20= 16=20+=0A=20.../expected/test_oat_hooks.out=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20213=20++++=0A=20= .../modules/test_oat_hooks/oat_hooks.conf=20=20=20=20=20|=20=20=201=20+=0A= =20.../test_oat_hooks/sql/test_oat_hooks.sql=20=20=20=20=20|=20=2059=20= ++=0A=20.../modules/test_oat_hooks/test_oat_hooks.c=20=20=20|=20935=20= ++++++++++++++++++=0A=20.../test_oat_hooks/test_oat_hooks.control=20=20=20= =20=20|=20=20=204=20+=0A=20.../modules/test_oat_hooks/test_oat_hooks.h=20= =20=20|=20=2025=20+=0A=2010=20files=20changed,=201285=20insertions(+)=0A=20= create=20mode=20100644=20src/test/modules/test_oat_hooks/.gitignore=0A=20= create=20mode=20100644=20src/test/modules/test_oat_hooks/Makefile=0A=20= create=20mode=20100644=20src/test/modules/test_oat_hooks/README=0A=20= create=20mode=20100644=20= src/test/modules/test_oat_hooks/expected/test_oat_hooks.out=0A=20create=20= mode=20100644=20src/test/modules/test_oat_hooks/oat_hooks.conf=0A=20= create=20mode=20100644=20= src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql=0A=20create=20= mode=20100644=20src/test/modules/test_oat_hooks/test_oat_hooks.c=0A=20= create=20mode=20100644=20= src/test/modules/test_oat_hooks/test_oat_hooks.control=0A=20create=20= mode=20100644=20src/test/modules/test_oat_hooks/test_oat_hooks.h=0A=0A= diff=20--git=20a/src/test/modules/Makefile=20b/src/test/modules/Makefile=0A= index=20dffc79b2d9..9090226daa=20100644=0A---=20= a/src/test/modules/Makefile=0A+++=20b/src/test/modules/Makefile=0A@@=20= -20,6=20+20,7=20@@=20SUBDIRS=20=3D=20\=0A=20=09=09=20=20= test_ginpostinglist=20\=0A=20=09=09=20=20test_integerset=20\=0A=20=09=09=20= =20test_misc=20\=0A+=09=09=20=20test_oat_hooks=20\=0A=20=09=09=20=20= test_parser=20\=0A=20=09=09=20=20test_pg_dump=20\=0A=20=09=09=20=20= test_predtest=20\=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/.gitignore=20= b/src/test/modules/test_oat_hooks/.gitignore=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..5dcb3ff972=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/.gitignore=0A@@=20-0,0=20+1,4=20@@=0A= +#=20Generated=20subdirectories=0A+/log/=0A+/results/=0A+/tmp_check/=0A= diff=20--git=20a/src/test/modules/test_oat_hooks/Makefile=20= b/src/test/modules/test_oat_hooks/Makefile=0Anew=20file=20mode=20100644=0A= index=200000000000..ff249a6d91=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/Makefile=0A@@=20-0,0=20+1,27=20@@=0A+#=20= src/test/modules/test_oat_hooks/Makefile=0A+=0A+MODULE_big=20=3D=20= test_oat_hooks=0A+OBJS=20=3D=20\=0A+=09$(WIN32RES)=20\=0A+=09= test_oat_hooks.o=0A+PGFILEDESC=20=3D=20"test_oat_hooks=20-=20example=20= use=20of=20object=20access=20hooks"=0A+=0A+EXTENSION=20=3D=20= test_oat_hooks=0A+#=20DATA=20=3D=20test_oat_hooks--1.0.sql=0A+=0A= +REGRESS=20=3D=20test_oat_hooks=0A+REGRESS_OPTS=20=3D=20= --temp-config=3D$(top_srcdir)/src/test/modules/test_oat_hooks/oat_hooks.co= nf=0A+#=20Disabled=20because=20these=20tests=20require=20= "shared_preload_libraries=3Dtest_oat_hooks",=0A+#=20which=20typical=20= installcheck=20users=20do=20not=20have=20(e.g.=20buildfarm=20clients).=0A= +NO_INSTALLCHECK=20=3D=201=0A+=0A+ifdef=20USE_PGXS=0A+PG_CONFIG=20=3D=20= pg_config=0A+PGXS=20:=3D=20$(shell=20$(PG_CONFIG)=20--pgxs)=0A+include=20= $(PGXS)=0A+else=0A+subdir=20=3D=20src/test/modules/test_oat_hooks=0A= +top_builddir=20=3D=20../../../..=0A+include=20= $(top_builddir)/src/Makefile.global=0A+include=20= $(top_srcdir)/contrib/contrib-global.mk=0A+endif=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/README=20= b/src/test/modules/test_oat_hooks/README=0Anew=20file=20mode=20100644=0A= index=200000000000..015deb25d4=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/README=0A@@=20-0,0=20+1,16=20@@=0A= +test_oat_hooks=20is=20an=20example=20of=20how=20to=20use=20the=20object=20= access=20hooks=20to=0A+enforce=20mandatory=20access=20controls.=0A+=0A= +Functions=0A+=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= +test_rls_hooks_permissive(CmdType=20cmdtype,=20Relation=20relation)=0A+=20= =20=20=20RETURNS=20List*=0A+=0A+Returns=20a=20list=20of=20policies=20= which=20should=20be=20added=20to=20any=20existing=0A+policies=20on=20the=20= relation,=20combined=20with=20OR.=0A+=0A= +test_rls_hooks_restrictive(CmdType=20cmdtype,=20Relation=20relation)=0A= +=20=20=20=20RETURNS=20List*=0A+=0A+Returns=20a=20list=20of=20policies=20= which=20should=20be=20added=20to=20any=20existing=0A+policies=20on=20the=20= relation,=20combined=20with=20AND.=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out=20= b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out=0Anew=20= file=20mode=20100644=0Aindex=200000000000..b0e3fe6e68=0A---=20/dev/null=0A= +++=20b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out=0A@@=20= -0,0=20+1,213=20@@=0A+LOAD=20'test_oat_hooks';=0A+--=20Turn=20on=20= logging=20messages=20to=20see=20audit=20messages=0A+SET=20= client_min_messages=20=3D=20'LOG';=0A+--=20SET=20commands=20fire=20both=20= the=20ProcessUtility_hook=20and=20the=0A+--=20object_access_hook_str.=20=20= Since=20the=20auditing=20GUC=20starts=20out=20false,=20we=20miss=20the=0A= +--=20initial=20"attempting"=20audit=20message=20from=20the=20= ProcessUtility_hook,=20but=20we=0A+--=20should=20thereafter=20see=20the=20= audit=20messages=0A+SET=20test_oat_hooks.audit=20=3D=20true;=0A+NOTICE:=20= =20in=20object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [test_oat_hooks.audit]=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20finished=20alter=20(set)=20[test_oat_hooks.audit]=0A+NOTICE:=20= =20in=20process=20utility:=20superuser=20finished=20set=0A+--=20Create=20= objects=20for=20use=20in=20the=20test=0A+CREATE=20USER=20= regress_test_user;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20CreateRoleStmt=0A+NOTICE:=20=20in=20object=20access:=20= superuser=20attempting=20create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20= in=20object=20access:=20superuser=20finished=20create=20(subId=3D0)=20= [explicit]=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= finished=20CreateRoleStmt=0A+CREATE=20TABLE=20regress_test_table=20(t=20= text);=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20attempting=20= CreateStmt=0A+NOTICE:=20=20in=20object=20access:=20superuser=20= attempting=20namespace=20search=20(subId=3D0)=20[no=20report=20on=20= violation,=20allowed]=0A+LINE=201:=20CREATE=20TABLE=20regress_test_table=20= (t=20text);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20^=0A+NOTICE:=20=20in=20object=20access:=20superuser=20finished=20= namespace=20search=20(subId=3D0)=20[no=20report=20on=20violation,=20= allowed]=0A+LINE=201:=20CREATE=20TABLE=20regress_test_table=20(t=20= text);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ^=0A+NOTICE:=20=20in=20object=20access:=20superuser=20attempting=20= create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20in=20object=20access:=20= superuser=20finished=20create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20= in=20object=20access:=20superuser=20attempting=20create=20(subId=3D0)=20= [explicit]=0A+NOTICE:=20=20in=20object=20access:=20superuser=20finished=20= create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20in=20object=20access:=20= superuser=20attempting=20create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20= in=20object=20access:=20superuser=20finished=20create=20(subId=3D0)=20= [explicit]=0A+NOTICE:=20=20in=20object=20access:=20superuser=20= attempting=20create=20(subId=3D0)=20[internal]=0A+NOTICE:=20=20in=20= object=20access:=20superuser=20finished=20create=20(subId=3D0)=20= [internal]=0A+NOTICE:=20=20in=20object=20access:=20superuser=20= attempting=20create=20(subId=3D0)=20[internal]=0A+NOTICE:=20=20in=20= object=20access:=20superuser=20finished=20create=20(subId=3D0)=20= [internal]=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= finished=20CreateStmt=0A+GRANT=20SELECT=20ON=20Table=20= regress_test_table=20TO=20public;=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20attempting=20GrantStmt=0A+NOTICE:=20=20in=20= process=20utility:=20superuser=20finished=20GrantStmt=0A+CREATE=20= FUNCTION=20regress_test_func=20(t=20text)=20RETURNS=20text=20AS=20$$=0A+=09= SELECT=20$1;=0A+$$=20LANGUAGE=20sql;=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20attempting=20CreateFunctionStmt=0A+NOTICE:=20=20= in=20object=20access:=20superuser=20attempting=20create=20(subId=3D0)=20= [explicit]=0A+NOTICE:=20=20in=20object=20access:=20superuser=20finished=20= create=20(subId=3D0)=20[explicit]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20CreateFunctionStmt=0A+GRANT=20EXECUTE=20= ON=20FUNCTION=20regress_test_func=20(text)=20TO=20public;=0A+NOTICE:=20=20= in=20process=20utility:=20superuser=20attempting=20GrantStmt=0A+NOTICE:=20= =20in=20process=20utility:=20superuser=20finished=20GrantStmt=0A+--=20Do=20= a=20few=20things=20as=20superuser=0A+SELECT=20*=20FROM=20= regress_test_table;=0A+NOTICE:=20=20in=20executor=20check=20perms:=20= superuser=20attempting=20execute=0A+NOTICE:=20=20in=20executor=20check=20= perms:=20superuser=20finished=20execute=0A+=20t=20=0A+---=0A+(0=20rows)=0A= +=0A+SELECT=20regress_test_func('arg');=0A+NOTICE:=20=20in=20executor=20= check=20perms:=20superuser=20attempting=20execute=0A+NOTICE:=20=20in=20= executor=20check=20perms:=20superuser=20finished=20execute=0A+=20= regress_test_func=20=0A+-------------------=0A+=20arg=0A+(1=20row)=0A+=0A= +SET=20work_mem=20=3D=208192;=0A+NOTICE:=20=20in=20process=20utility:=20= superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20superuser=20= finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+RESET=20work_mem;=0A+NOTICE:=20=20= in=20process=20utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20= in=20object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20superuser=20= finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+ALTER=20SYSTEM=20SET=20work_mem=20= =3D=208192;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20alter=20system=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(alter=20system=20set)=20[work_mem]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(alter=20system=20set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20alter=20system=0A+ALTER=20SYSTEM=20= RESET=20work_mem;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20alter=20system=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(alter=20system=20set)=20[work_mem]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(alter=20system=20set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20alter=20system=0A+--=20Do=20those=20= same=20things=20as=20non-superuser=0A+SET=20SESSION=20AUTHORIZATION=20= regress_test_user;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20set=0A+NOTICE:=20=20in=20object_access_hook_str:=20= non-superuser=20attempting=20alter=20(set)=20[session_authorization]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20non-superuser=20finished=20= alter=20(set)=20[session_authorization]=0A+NOTICE:=20=20in=20process=20= utility:=20non-superuser=20finished=20set=0A+SELECT=20*=20FROM=20= regress_test_table;=0A+NOTICE:=20=20in=20object=20access:=20= non-superuser=20attempting=20namespace=20search=20(subId=3D0)=20[no=20= report=20on=20violation,=20allowed]=0A+LINE=201:=20SELECT=20*=20FROM=20= regress_test_table;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20^=0A+NOTICE:=20=20in=20object=20access:=20non-superuser=20= finished=20namespace=20search=20(subId=3D0)=20[no=20report=20on=20= violation,=20allowed]=0A+LINE=201:=20SELECT=20*=20FROM=20= regress_test_table;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20^=0A+NOTICE:=20=20in=20executor=20check=20perms:=20= non-superuser=20attempting=20execute=0A+NOTICE:=20=20in=20executor=20= check=20perms:=20non-superuser=20finished=20execute=0A+=20t=20=0A+---=0A= +(0=20rows)=0A+=0A+SELECT=20regress_test_func('arg');=0A+NOTICE:=20=20in=20= executor=20check=20perms:=20non-superuser=20attempting=20execute=0A= +NOTICE:=20=20in=20executor=20check=20perms:=20non-superuser=20finished=20= execute=0A+=20regress_test_func=20=0A+-------------------=0A+=20arg=0A= +(1=20row)=0A+=0A+SET=20work_mem=20=3D=208192;=0A+NOTICE:=20=20in=20= process=20utility:=20non-superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20non-superuser=20attempting=20alter=20(set)=20= [work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20non-superuser=20= finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20non-superuser=20finished=20set=0A+RESET=20work_mem;=0A= +NOTICE:=20=20in=20process=20utility:=20non-superuser=20attempting=20set=0A= +NOTICE:=20=20in=20object_access_hook_str:=20non-superuser=20attempting=20= alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20= non-superuser=20finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20= process=20utility:=20non-superuser=20finished=20set=0A+ALTER=20SYSTEM=20= SET=20work_mem=20=3D=208192;=0A+NOTICE:=20=20in=20process=20utility:=20= non-superuser=20attempting=20alter=20system=0A+ERROR:=20=20must=20be=20= superuser=20to=20execute=20ALTER=20SYSTEM=20command=0A+ALTER=20SYSTEM=20= RESET=20work_mem;=0A+NOTICE:=20=20in=20process=20utility:=20= non-superuser=20attempting=20alter=20system=0A+ERROR:=20=20must=20be=20= superuser=20to=20execute=20ALTER=20SYSTEM=20command=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+NOTICE:=20=20in=20process=20utility:=20non-superuser=20= attempting=20set=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(set)=20[session_authorization]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(set)=20[session_authorization]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+--=20Turn=20off=20non-superuser=20= permissions=0A+SET=20test_oat_hooks.deny_set_variable=20=3D=20true;=0A= +NOTICE:=20=20in=20process=20utility:=20superuser=20attempting=20set=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20attempting=20= alter=20(set)=20[test_oat_hooks.deny_set_variable]=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20finished=20alter=20(set)=20= [test_oat_hooks.deny_set_variable]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+SET=20= test_oat_hooks.deny_alter_system=20=3D=20true;=0A+NOTICE:=20=20in=20= process=20utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [test_oat_hooks.deny_alter_system]=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20finished=20alter=20(set)=20= [test_oat_hooks.deny_alter_system]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+SET=20= test_oat_hooks.deny_object_access=20=3D=20true;=0A+NOTICE:=20=20in=20= process=20utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [test_oat_hooks.deny_object_access]=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20finished=20alter=20(set)=20= [test_oat_hooks.deny_object_access]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+SET=20= test_oat_hooks.deny_exec_perms=20=3D=20true;=0A+NOTICE:=20=20in=20= process=20utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [test_oat_hooks.deny_exec_perms]=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20finished=20alter=20(set)=20= [test_oat_hooks.deny_exec_perms]=0A+NOTICE:=20=20in=20process=20utility:=20= superuser=20finished=20set=0A+SET=20test_oat_hooks.deny_utility_commands=20= =3D=20true;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20set=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(set)=20= [test_oat_hooks.deny_utility_commands]=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20finished=20alter=20(set)=20= [test_oat_hooks.deny_utility_commands]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+--=20Try=20again=20as=20= non-superuser=20with=20permisisons=20denied=0A+SET=20SESSION=20= AUTHORIZATION=20regress_test_user;=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20non-superuser=20attempting=20alter=20(set)=20= [session_authorization]=0A+ERROR:=20=20permission=20denied:=20set=20= session_authorization=0A+SELECT=20*=20FROM=20regress_test_table;=0A= +NOTICE:=20=20in=20object=20access:=20superuser=20attempting=20namespace=20= search=20(subId=3D0)=20[no=20report=20on=20violation,=20allowed]=0A+LINE=20= 1:=20SELECT=20*=20FROM=20regress_test_table;=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20^=0A+NOTICE:=20=20in=20object=20= access:=20superuser=20finished=20namespace=20search=20(subId=3D0)=20[no=20= report=20on=20violation,=20allowed]=0A+LINE=201:=20SELECT=20*=20FROM=20= regress_test_table;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20^=0A+NOTICE:=20=20in=20executor=20check=20perms:=20= superuser=20attempting=20execute=0A+NOTICE:=20=20in=20executor=20check=20= perms:=20superuser=20finished=20execute=0A+=20t=20=0A+---=0A+(0=20rows)=0A= +=0A+SELECT=20regress_test_func('arg');=0A+NOTICE:=20=20in=20executor=20= check=20perms:=20superuser=20attempting=20execute=0A+NOTICE:=20=20in=20= executor=20check=20perms:=20superuser=20finished=20execute=0A+=20= regress_test_func=20=0A+-------------------=0A+=20arg=0A+(1=20row)=0A+=0A= +SET=20work_mem=20=3D=208192;=0A+NOTICE:=20=20in=20process=20utility:=20= superuser=20attempting=20set=0A+NOTICE:=20=20in=20= object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20superuser=20= finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+RESET=20work_mem;=0A+NOTICE:=20=20= in=20process=20utility:=20superuser=20attempting=20set=0A+NOTICE:=20=20= in=20object_access_hook_str:=20superuser=20attempting=20alter=20(set)=20= [work_mem]=0A+NOTICE:=20=20in=20object_access_hook_str:=20superuser=20= finished=20alter=20(set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+ALTER=20SYSTEM=20SET=20work_mem=20= =3D=208192;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20alter=20system=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(alter=20system=20set)=20[work_mem]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(alter=20system=20set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20alter=20system=0A+ALTER=20SYSTEM=20= RESET=20work_mem;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20alter=20system=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(alter=20system=20set)=20[work_mem]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(alter=20system=20set)=20[work_mem]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20alter=20system=0A+RESET=20SESSION=20= AUTHORIZATION;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20= attempting=20set=0A+NOTICE:=20=20in=20object_access_hook_str:=20= superuser=20attempting=20alter=20(set)=20[session_authorization]=0A= +NOTICE:=20=20in=20object_access_hook_str:=20superuser=20finished=20= alter=20(set)=20[session_authorization]=0A+NOTICE:=20=20in=20process=20= utility:=20superuser=20finished=20set=0A+SET=20test_oat_hooks.audit=20=3D=20= false;=0A+NOTICE:=20=20in=20process=20utility:=20superuser=20attempting=20= set=0A+RESET=20client_min_messages;=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/oat_hooks.conf=20= b/src/test/modules/test_oat_hooks/oat_hooks.conf=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..a44cbdd4a4=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/oat_hooks.conf=0A@@=20-0,0=20+1=20@@=0A= +shared_preload_libraries=20=3D=20test_oat_hooks=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql=20= b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql=0Anew=20file=20= mode=20100644=0Aindex=200000000000..86addbd670=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql=0A@@=20-0,0=20= +1,59=20@@=0A+LOAD=20'test_oat_hooks';=0A+=0A+--=20Turn=20on=20logging=20= messages=20to=20see=20audit=20messages=0A+SET=20client_min_messages=20=3D=20= 'LOG';=0A+=0A+--=20SET=20commands=20fire=20both=20the=20= ProcessUtility_hook=20and=20the=0A+--=20object_access_hook_str.=20=20= Since=20the=20auditing=20GUC=20starts=20out=20false,=20we=20miss=20the=0A= +--=20initial=20"attempting"=20audit=20message=20from=20the=20= ProcessUtility_hook,=20but=20we=0A+--=20should=20thereafter=20see=20the=20= audit=20messages=0A+SET=20test_oat_hooks.audit=20=3D=20true;=0A+=0A+--=20= Create=20objects=20for=20use=20in=20the=20test=0A+CREATE=20USER=20= regress_test_user;=0A+CREATE=20TABLE=20regress_test_table=20(t=20text);=0A= +GRANT=20SELECT=20ON=20Table=20regress_test_table=20TO=20public;=0A= +CREATE=20FUNCTION=20regress_test_func=20(t=20text)=20RETURNS=20text=20= AS=20$$=0A+=09SELECT=20$1;=0A+$$=20LANGUAGE=20sql;=0A+GRANT=20EXECUTE=20= ON=20FUNCTION=20regress_test_func=20(text)=20TO=20public;=0A+=0A+--=20Do=20= a=20few=20things=20as=20superuser=0A+SELECT=20*=20FROM=20= regress_test_table;=0A+SELECT=20regress_test_func('arg');=0A+SET=20= work_mem=20=3D=208192;=0A+RESET=20work_mem;=0A+ALTER=20SYSTEM=20SET=20= work_mem=20=3D=208192;=0A+ALTER=20SYSTEM=20RESET=20work_mem;=0A+=0A+--=20= Do=20those=20same=20things=20as=20non-superuser=0A+SET=20SESSION=20= AUTHORIZATION=20regress_test_user;=0A+SELECT=20*=20FROM=20= regress_test_table;=0A+SELECT=20regress_test_func('arg');=0A+SET=20= work_mem=20=3D=208192;=0A+RESET=20work_mem;=0A+ALTER=20SYSTEM=20SET=20= work_mem=20=3D=208192;=0A+ALTER=20SYSTEM=20RESET=20work_mem;=0A+RESET=20= SESSION=20AUTHORIZATION;=0A+=0A+--=20Turn=20off=20non-superuser=20= permissions=0A+SET=20test_oat_hooks.deny_set_variable=20=3D=20true;=0A= +SET=20test_oat_hooks.deny_alter_system=20=3D=20true;=0A+SET=20= test_oat_hooks.deny_object_access=20=3D=20true;=0A+SET=20= test_oat_hooks.deny_exec_perms=20=3D=20true;=0A+SET=20= test_oat_hooks.deny_utility_commands=20=3D=20true;=0A+=0A+--=20Try=20= again=20as=20non-superuser=20with=20permisisons=20denied=0A+SET=20= SESSION=20AUTHORIZATION=20regress_test_user;=0A+SELECT=20*=20FROM=20= regress_test_table;=0A+SELECT=20regress_test_func('arg');=0A+SET=20= work_mem=20=3D=208192;=0A+RESET=20work_mem;=0A+ALTER=20SYSTEM=20SET=20= work_mem=20=3D=208192;=0A+ALTER=20SYSTEM=20RESET=20work_mem;=0A+=0A= +RESET=20SESSION=20AUTHORIZATION;=0A+=0A+SET=20test_oat_hooks.audit=20=3D=20= false;=0A+=0A+RESET=20client_min_messages;=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/test_oat_hooks.c=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.c=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..177be98a71=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.c=0A@@=20-0,0=20+1,935=20= @@=0A= +/*-----------------------------------------------------------------------= ---=0A+=20*=0A+=20*=20test_oat_hooks.c=0A+=20*=09=09Code=20for=20testing=20= mandatory=20access=20control=20(MAC)=20using=20object=20access=20hooks.=0A= +=20*=0A+=20*=20Copyright=20(c)=202015-2022,=20PostgreSQL=20Global=20= Development=20Group=0A+=20*=0A+=20*=20IDENTIFICATION=0A+=20*=09=09= src/test/modules/test_oat_hooks/test_oat_hooks.c=0A+=20*=0A+=20*=20= -------------------------------------------------------------------------=0A= +=20*/=0A+=0A+#include=20"postgres.h"=0A+=0A+#include=20= "catalog/dependency.h"=0A+#include=20"catalog/objectaccess.h"=0A= +#include=20"catalog/pg_proc.h"=0A+#include=20"executor/executor.h"=0A= +#include=20"fmgr.h"=0A+#include=20"miscadmin.h"=0A+#include=20= "tcop/utility.h"=0A+#include=20"test_oat_hooks.h"=0A+=0A= +PG_MODULE_MAGIC;=0A+=0A+/*=0A+=20*=20GUCs=20controlling=20which=20= operations=20to=20deny=0A+=20*/=0A+static=20bool=20= REGRESS_deny_set_variable=20=3D=20false;=0A+static=20bool=20= REGRESS_deny_alter_system=20=3D=20false;=0A+static=20bool=20= REGRESS_deny_object_access=20=3D=20false;=0A+static=20bool=20= REGRESS_deny_exec_perms=20=3D=20false;=0A+static=20bool=20= REGRESS_deny_utility_commands=20=3D=20false;=0A+static=20bool=20= REGRESS_audit=20=3D=20false;=0A+=0A+/*=20Saved=20hook=20values=20in=20= case=20of=20unload=20*/=0A+static=20object_access_hook_type=20= next_object_access_hook=20=3D=20NULL;=0A+static=20= object_access_hook_type_str=20next_object_access_hook_str=20=3D=20NULL;=0A= +static=20ExecutorCheckPerms_hook_type=20next_exec_check_perms_hook=20=3D=20= NULL;=0A+static=20ProcessUtility_hook_type=20next_ProcessUtility_hook=20= =3D=20NULL;=0A+=0A+/*=20Test=20Object=20Access=20Type=20Hook=20hooks=20= */=0A+static=20void=20REGRESS_object_access_hook_str(ObjectAccessType=20= access,=0A+=09=09=09=09=09=09=09=09=09=09=20=20=20Oid=20classId,=20const=20= char=20*objName,=0A+=09=09=09=09=09=09=09=09=09=09=20=20=20int=20subId,=20= void=20*arg);=0A+static=20void=20= REGRESS_object_access_hook(ObjectAccessType=20access,=20Oid=20classId,=0A= +=09=09=09=09=09=09=09=09=09=20=20=20Oid=20objectId,=20int=20subId,=20= void=20*arg);=0A+static=20bool=20REGRESS_exec_check_perms(List=20= *rangeTabls,=20bool=20do_abort);=0A+static=20void=20= REGRESS_utility_command(PlannedStmt=20*pstmt,=0A+=09=09=09=09=09=09=09=09= =09const=20char=20*queryString,=20bool=20readOnlyTree,=0A+=09=09=09=09=09= =09=09=09=09ProcessUtilityContext=20context,=0A+=09=09=09=09=09=09=09=09=09= ParamListInfo=20params,=0A+=09=09=09=09=09=09=09=09=09QueryEnvironment=20= *queryEnv,=0A+=09=09=09=09=09=09=09=09=09DestReceiver=20*dest,=20= QueryCompletion=20*qc);=0A+=0A+/*=20Helper=20functions=20*/=0A+static=20= const=20char=20*nodetag_to_string(NodeTag=20tag);=0A+static=20char=20= *accesstype_to_string(ObjectAccessType=20access,=20int=20subId);=0A= +static=20char=20*accesstype_arg_to_string(ObjectAccessType=20access,=20= void=20*arg);=0A+=0A+=0A+void=09=09_PG_init(void);=0A+void=09=09= _PG_fini(void);=0A+=0A+/*=0A+=20*=20Module=20load/unload=20callback=0A+=20= */=0A+void=0A+_PG_init(void)=0A+{=0A+=09/*=0A+=09=20*=20We=20allow=20to=20= load=20the=20Object=20Access=20Type=20test=20module=20on=20= single-user-mode=0A+=09=20*=20or=20shared_preload_libraries=20settings=20= only.=0A+=09=20*/=0A+=09if=20(IsUnderPostmaster)=0A+=09=09ereport(ERROR,=0A= +=09=09=09=09(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),=0A+=09=09= =09=09=20errmsg("test_oat_hooks=20must=20be=20loaded=20via=20= shared_preload_libraries")));=0A+=0A+=09/*=0A+=09=20*=20= test_oat_hooks.deny_set_variable=20=3D=20(on|off)=0A+=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.deny_set_variable",=0A+=09=09=09= =09=09=09=09=20"Deny=20non-superuser=20set=20permissions",=0A+=09=09=09=09= =09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20®RESS_deny_set_variable,=0A= +=09=09=09=09=09=09=09=20false,=0A+=09=09=09=09=09=09=09=20PGC_SUSET,=0A= +=09=09=09=09=09=09=09=20GUC_NOT_IN_SAMPLE,=0A+=09=09=09=09=09=09=09=20= NULL,=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL);=0A= +=0A+=09/*=0A+=09=20*=20test_oat_hooks.deny_alter_system=20=3D=20= (on|off)=0A+=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.deny_alter_system",=0A+=09=09=09= =09=09=09=09=20"Deny=20non-superuser=20alter=20system=20set=20= permissions",=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20= ®RESS_deny_alter_system,=0A+=09=09=09=09=09=09=09=20false,=0A+=09=09=09= =09=09=09=09=20PGC_SUSET,=0A+=09=09=09=09=09=09=09=20GUC_NOT_IN_SAMPLE,=0A= +=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09= =09=09=09=09=09=20NULL);=0A+=0A+=09/*=0A+=09=20*=20= test_oat_hooks.deny_object_access=20=3D=20(on|off)=0A+=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.deny_object_access",=0A+=09=09=09= =09=09=09=09=20"Deny=20non-superuser=20object=20access=20permissions",=0A= +=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20= ®RESS_deny_object_access,=0A+=09=09=09=09=09=09=09=20false,=0A+=09=09=09= =09=09=09=09=20PGC_SUSET,=0A+=09=09=09=09=09=09=09=20GUC_NOT_IN_SAMPLE,=0A= +=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09= =09=09=09=09=09=20NULL);=0A+=0A+=09/*=0A+=09=20*=20= test_oat_hooks.deny_exec_perms=20=3D=20(on|off)=0A+=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.deny_exec_perms",=0A+=09=09=09=09= =09=09=09=20"Deny=20non-superuser=20exec=20permissions",=0A+=09=09=09=09=09= =09=09=20NULL,=0A+=09=09=09=09=09=09=09=20®RESS_deny_exec_perms,=0A+=09= =09=09=09=09=09=09=20false,=0A+=09=09=09=09=09=09=09=20PGC_SUSET,=0A+=09=09= =09=09=09=09=09=20GUC_NOT_IN_SAMPLE,=0A+=09=09=09=09=09=09=09=20NULL,=0A= +=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL);=0A+=0A+=09= /*=0A+=09=20*=20test_oat_hooks.deny_utility_commands=20=3D=20(on|off)=0A= +=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.deny_utility_commands",=0A+=09=09= =09=09=09=09=09=20"Deny=20non-superuser=20utility=20commands",=0A+=09=09=09= =09=09=09=09=20NULL,=0A+=09=09=09=09=09=09=09=20= ®RESS_deny_utility_commands,=0A+=09=09=09=09=09=09=09=20false,=0A+=09=09= =09=09=09=09=09=20PGC_SUSET,=0A+=09=09=09=09=09=09=09=20= GUC_NOT_IN_SAMPLE,=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09= =09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL);=0A+=0A+=09/*=0A+=09=20*=20= test_oat_hooks.audit=20=3D=20(on|off)=0A+=09=20*/=0A+=09= DefineCustomBoolVariable("test_oat_hooks.audit",=0A+=09=09=09=09=09=09=09= =20"Turn=20on/off=20debug=20audit=20messages",=0A+=09=09=09=09=09=09=09=20= NULL,=0A+=09=09=09=09=09=09=09=20®RESS_audit,=0A+=09=09=09=09=09=09=09= =20false,=0A+=09=09=09=09=09=09=09=20PGC_SUSET,=0A+=09=09=09=09=09=09=09=20= GUC_NOT_IN_SAMPLE,=0A+=09=09=09=09=09=09=09=20NULL,=0A+=09=09=09=09=09=09= =09=20NULL,=0A+=09=09=09=09=09=09=09=20NULL);=0A+=0A+=09= MarkGUCPrefixReserved("test_oat_hooks");=0A+=0A+=09/*=20Object=20access=20= hook=20*/=0A+=09next_object_access_hook=20=3D=20object_access_hook;=0A+=09= object_access_hook=20=3D=20REGRESS_object_access_hook;=0A+=0A+=09/*=20= Object=20access=20hook=20str=20*/=0A+=09next_object_access_hook_str=20=3D=20= object_access_hook_str;=0A+=09object_access_hook_str=20=3D=20= REGRESS_object_access_hook_str;=0A+=0A+=09/*=20DML=20permission=20check=20= */=0A+=09next_exec_check_perms_hook=20=3D=20ExecutorCheckPerms_hook;=0A+=09= ExecutorCheckPerms_hook=20=3D=20REGRESS_exec_check_perms;=0A+=0A+=09/*=20= ProcessUtility=20hook=20*/=0A+=09next_ProcessUtility_hook=20=3D=20= ProcessUtility_hook;=0A+=09ProcessUtility_hook=20=3D=20= REGRESS_utility_command;=0A+}=0A+=0A+void=0A+_PG_fini(void)=0A+{=0A+=09= /*=20Unload=20hooks=20*/=0A+=09if=20(object_access_hook=20=3D=3D=20= REGRESS_object_access_hook)=0A+=09=09object_access_hook=20=3D=20= next_object_access_hook;=0A+=0A+=09if=20(object_access_hook_str=20=3D=3D=20= REGRESS_object_access_hook_str)=0A+=09=09object_access_hook_str=20=3D=20= next_object_access_hook_str;=0A+=0A+=09if=20(ExecutorCheckPerms_hook=20= =3D=3D=20REGRESS_exec_check_perms)=0A+=09=09ExecutorCheckPerms_hook=20=3D=20= next_exec_check_perms_hook;=0A+=0A+=09if=20(ProcessUtility_hook=20=3D=3D=20= REGRESS_utility_command)=0A+=09=09ProcessUtility_hook=20=3D=20= next_ProcessUtility_hook;=0A+}=0A+=0A+static=20void=0A= +emit_audit_message(const=20char=20*type,=20const=20char=20*hook,=20char=20= *action,=20char=20*objName)=0A+{=0A+=09if=20(REGRESS_audit)=0A+=09{=0A+=09= =09const=20char=20*who=20=3D=20superuser_arg(GetUserId())=20?=20= "superuser"=20:=20"non-superuser";=0A+=0A+=09=09if=20(objName)=0A+=09=09=09= ereport(NOTICE,=0A+=09=09=09=09=09(errcode(ERRCODE_INTERNAL_ERROR),=0A+=09= =09=09=09=09=20errmsg("in=20%s:=20%s=20%s=20%s=20[%s]",=20hook,=20who,=20= type,=20action,=20objName)));=0A+=09=09else=0A+=09=09=09ereport(NOTICE,=0A= +=09=09=09=09=09(errcode(ERRCODE_INTERNAL_ERROR),=0A+=09=09=09=09=09=20= errmsg("in=20%s:=20%s=20%s=20%s",=20hook,=20who,=20type,=20action)));=0A= +=09}=0A+=0A+=09if=20(action)=0A+=09=09pfree(action);=0A+=09if=20= (objName)=0A+=09=09pfree(objName);=0A+}=0A+=0A+static=20void=0A= +audit_attempt(const=20char=20*hook,=20char=20*action,=20char=20= *objName)=0A+{=0A+=09emit_audit_message("attempting",=20hook,=20action,=20= objName);=0A+}=0A+=0A+static=20void=0A+audit_success(const=20char=20= *hook,=20char=20*action,=20char=20*objName)=0A+{=0A+=09= emit_audit_message("finished",=20hook,=20action,=20objName);=0A+}=0A+=0A= +static=20void=0A+audit_failure(const=20char=20*hook,=20char=20*action,=20= char=20*objName)=0A+{=0A+=09emit_audit_message("denied",=20hook,=20= action,=20objName);=0A+}=0A+=0A+static=20void=0A= +REGRESS_object_access_hook_str(ObjectAccessType=20access,=20Oid=20= classId,=20const=20char=20*objName,=20int=20subId,=20void=20*arg)=0A+{=0A= +=09audit_attempt("object_access_hook_str",=0A+=09=09=09=09=20=20= accesstype_to_string(access,=20subId),=0A+=09=09=09=09=20=20= pstrdup(objName));=0A+=0A+=09if=20(next_object_access_hook_str)=0A+=09{=0A= +=09=09(*next_object_access_hook_str)(access,=20classId,=20objName,=20= subId,=20arg);=0A+=09}=0A+=0A+=09switch=20(access)=0A+=09{=0A+=09=09case=20= OAT_POST_ALTER:=0A+=09=09=09if=20(subId=20&=20ACL_SET_VALUE)=0A+=09=09=09= {=0A+=09=09=09=09if=20(REGRESS_deny_set_variable=20&&=20= !superuser_arg(GetUserId()))=0A+=09=09=09=09=09ereport(ERROR,=0A+=09=09=09= =09=09=09=09(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=09=09= =09=20errmsg("permission=20denied:=20set=20%s",=20objName)));=0A+=09=09=09= }=0A+=09=09=09else=20if=20(subId=20&=20ACL_ALTER_SYSTEM)=0A+=09=09=09{=0A= +=09=09=09=09if=20(REGRESS_deny_alter_system=20&&=20= !superuser_arg(GetUserId()))=0A+=09=09=09=09=09ereport(ERROR,=0A+=09=09=09= =09=09=09=09(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=09=09= =09=20errmsg("permission=20denied:=20alter=20system=20set=20%s",=20= objName)));=0A+=09=09=09}=0A+=09=09=09else=0A+=09=09=09=09elog(ERROR,=20= "Unknown=20SettingAclRelationId=20subId:=20%d",=20subId);=0A+=09=09=09= break;=0A+=09=09default:=0A+=09=09=09break;=0A+=09}=0A+=0A+=09= audit_success("object_access_hook_str",=0A+=09=09=09=09=20=20= accesstype_to_string(access,=20subId),=0A+=09=09=09=09=20=20= pstrdup(objName));=0A+}=0A+=0A+static=20void=0A= +REGRESS_object_access_hook=20(ObjectAccessType=20access,=20Oid=20= classId,=20Oid=20objectId,=20int=20subId,=20void=20*arg)=0A+{=0A+=09= audit_attempt("object=20access",=0A+=09=09=09=09=20=20= accesstype_to_string(access,=200),=0A+=09=09=09=09=20=20= accesstype_arg_to_string(access,=20arg));=0A+=0A+=09if=20= (REGRESS_deny_object_access=20&&=20!superuser_arg(GetUserId()))=0A+=09=09= ereport(ERROR,=0A+=09=09=09=09(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A= +=09=09=09=09=20errmsg("permission=20denied:=20%s=20[%s]",=0A+=09=09=09=09= =09=09accesstype_to_string(access,=200),=0A+=09=09=09=09=09=09= accesstype_arg_to_string(access,=20arg))));=0A+=0A+=09/*=20Forward=20to=20= next=20hook=20in=20the=20chain=20*/=0A+=09if=20(next_object_access_hook)=0A= +=09=09(*next_object_access_hook)(access,=20classId,=20objectId,=20= subId,=20arg);=0A+=0A+=09audit_success("object=20access",=0A+=09=09=09=09= =20=20accesstype_to_string(access,=200),=0A+=09=09=09=09=20=20= accesstype_arg_to_string(access,=20arg));=0A+}=0A+=0A+static=20bool=0A= +REGRESS_exec_check_perms(List=20*rangeTabls,=20bool=20do_abort)=0A+{=0A= +=09bool=09=09am_super=20=3D=20superuser_arg(GetUserId());=0A+=09bool=09=09= allow=20=3D=20true;=0A+=0A+=09audit_attempt("executor=20check=20perms",=20= pstrdup("execute"),=20NULL);=0A+=0A+=09/*=20Perform=20our=20check=20*/=0A= +=09allow=20=3D=20!REGRESS_deny_exec_perms=20||=20am_super;=0A+=09if=20= (do_abort=20&&=20!allow)=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=20= errmsg("permission=20denied:=20%s",=20"execute")));=0A+=0A+=09/*=20= Forward=20to=20next=20hook=20in=20the=20chain=20*/=0A+=09if=20= (next_exec_check_perms_hook=20&&=0A+=09=09!(*next_exec_check_perms_hook)=20= (rangeTabls,=20do_abort))=0A+=09=09allow=20=3D=20false;=0A+=0A+=09if=20= (allow)=0A+=09=09audit_success("executor=20check=20perms",=0A+=09=09=09=09= =09=20=20pstrdup("execute"),=0A+=09=09=09=09=09=20=20NULL);=0A+=09else=0A= +=09=09audit_failure("executor=20check=20perms",=0A+=09=09=09=09=09=20=20= pstrdup("execute"),=0A+=09=09=09=09=09=20=20NULL);=0A+=0A+=09return=20= allow;=0A+}=0A+=0A+static=20void=0A+REGRESS_utility_command(PlannedStmt=20= *pstmt,=0A+=09=09=09=09=09=20=20const=20char=20*queryString,=0A+=09=09=09= =09=09=20=20bool=20readOnlyTree,=0A+=09=09=09=09=09=20=20= ProcessUtilityContext=20context,=0A+=09=09=09=09=09=20=20ParamListInfo=20= params,=0A+=09=09=09=09=09=20=20QueryEnvironment=20*queryEnv,=0A+=09=09=09= =09=09=20=20DestReceiver=20*dest,=0A+=09=09=09=09=09=20=20= QueryCompletion=20*qc)=0A+{=0A+=09Node=09=20=20=20*parsetree=20=3D=20= pstmt->utilityStmt;=0A+=0A+=09const=20char=20*action;=0A+=09NodeTag=20= tag=20=3D=20nodeTag(parsetree);=0A+=0A+=09switch=20(tag)=0A+=09{=0A+=09=09= case=20T_VariableSetStmt:=0A+=09=09=09action=20=3D=20"set";=0A+=09=09=09= break;=0A+=09=09case=20T_AlterSystemStmt:=0A+=09=09=09action=20=3D=20= "alter=20system";=0A+=09=09=09break;=0A+=09=09case=20T_LoadStmt:=0A+=09=09= =09action=20=3D=20"load";=0A+=09=09=09break;=0A+=09=09default:=0A+=09=09=09= action=20=3D=20nodetag_to_string(tag);=0A+=09=09=09break;=0A+=09}=0A+=0A= +=09audit_attempt("process=20utility",=0A+=09=09=09=09=20=20= pstrdup(action),=0A+=09=09=09=09=20=20NULL);=0A+=0A+=09/*=20Check=20= permissions=20*/=0A+=09if=20(REGRESS_deny_utility_commands=20&&=20= !superuser_arg(GetUserId()))=0A+=09=09ereport(ERROR,=0A+=09=09=09=09= (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),=0A+=09=09=09=09=20= errmsg("permission=20denied:=20%s",=20action)));=0A+=0A+=09/*=20Forward=20= to=20next=20hook=20in=20the=20chain=20*/=0A+=09if=20= (next_ProcessUtility_hook)=0A+=09=09(*next_ProcessUtility_hook)=20= (pstmt,=20queryString,=20readOnlyTree,=0A+=09=09=09=09=09=09=09=09=09=20= context,=20params,=20queryEnv,=0A+=09=09=09=09=09=09=09=09=09=20dest,=20= qc);=0A+=09else=0A+=09=09standard_ProcessUtility(pstmt,=20queryString,=20= readOnlyTree,=0A+=09=09=09=09=09=09=09=09context,=20params,=20queryEnv,=0A= +=09=09=09=09=09=09=09=09dest,=20qc);=0A+=0A+=09/*=20We're=20done=20*/=0A= +=09audit_success("process=20utility",=0A+=09=09=09=09=20=20= pstrdup(action),=0A+=09=09=09=09=20=20NULL);=0A+}=0A+=0A+static=20const=20= char=20*=0A+nodetag_to_string(NodeTag=20tag)=0A+{=0A+=09switch=20(tag)=0A= +=09{=0A+=09=09case=20T_Invalid:=20return=20"Invalid";=20break;=0A+=09=09= case=20T_IndexInfo:=20return=20"IndexInfo";=20break;=0A+=09=09case=20= T_ExprContext:=20return=20"ExprContext";=20break;=0A+=09=09case=20= T_ProjectionInfo:=20return=20"ProjectionInfo";=20break;=0A+=09=09case=20= T_JunkFilter:=20return=20"JunkFilter";=20break;=0A+=09=09case=20= T_OnConflictSetState:=20return=20"OnConflictSetState";=20break;=0A+=09=09= case=20T_ResultRelInfo:=20return=20"ResultRelInfo";=20break;=0A+=09=09= case=20T_EState:=20return=20"EState";=20break;=0A+=09=09case=20= T_TupleTableSlot:=20return=20"TupleTableSlot";=20break;=0A+=09=09case=20= T_Plan:=20return=20"Plan";=20break;=0A+=09=09case=20T_Result:=20return=20= "Result";=20break;=0A+=09=09case=20T_ProjectSet:=20return=20= "ProjectSet";=20break;=0A+=09=09case=20T_ModifyTable:=20return=20= "ModifyTable";=20break;=0A+=09=09case=20T_Append:=20return=20"Append";=20= break;=0A+=09=09case=20T_MergeAppend:=20return=20"MergeAppend";=20break;=0A= +=09=09case=20T_RecursiveUnion:=20return=20"RecursiveUnion";=20break;=0A= +=09=09case=20T_BitmapAnd:=20return=20"BitmapAnd";=20break;=0A+=09=09= case=20T_BitmapOr:=20return=20"BitmapOr";=20break;=0A+=09=09case=20= T_Scan:=20return=20"Scan";=20break;=0A+=09=09case=20T_SeqScan:=20return=20= "SeqScan";=20break;=0A+=09=09case=20T_SampleScan:=20return=20= "SampleScan";=20break;=0A+=09=09case=20T_IndexScan:=20return=20= "IndexScan";=20break;=0A+=09=09case=20T_IndexOnlyScan:=20return=20= "IndexOnlyScan";=20break;=0A+=09=09case=20T_BitmapIndexScan:=20return=20= "BitmapIndexScan";=20break;=0A+=09=09case=20T_BitmapHeapScan:=20return=20= "BitmapHeapScan";=20break;=0A+=09=09case=20T_TidScan:=20return=20= "TidScan";=20break;=0A+=09=09case=20T_TidRangeScan:=20return=20= "TidRangeScan";=20break;=0A+=09=09case=20T_SubqueryScan:=20return=20= "SubqueryScan";=20break;=0A+=09=09case=20T_FunctionScan:=20return=20= "FunctionScan";=20break;=0A+=09=09case=20T_ValuesScan:=20return=20= "ValuesScan";=20break;=0A+=09=09case=20T_TableFuncScan:=20return=20= "TableFuncScan";=20break;=0A+=09=09case=20T_CteScan:=20return=20= "CteScan";=20break;=0A+=09=09case=20T_NamedTuplestoreScan:=20return=20= "NamedTuplestoreScan";=20break;=0A+=09=09case=20T_WorkTableScan:=20= return=20"WorkTableScan";=20break;=0A+=09=09case=20T_ForeignScan:=20= return=20"ForeignScan";=20break;=0A+=09=09case=20T_CustomScan:=20return=20= "CustomScan";=20break;=0A+=09=09case=20T_Join:=20return=20"Join";=20= break;=0A+=09=09case=20T_NestLoop:=20return=20"NestLoop";=20break;=0A+=09= =09case=20T_MergeJoin:=20return=20"MergeJoin";=20break;=0A+=09=09case=20= T_HashJoin:=20return=20"HashJoin";=20break;=0A+=09=09case=20T_Material:=20= return=20"Material";=20break;=0A+=09=09case=20T_Memoize:=20return=20= "Memoize";=20break;=0A+=09=09case=20T_Sort:=20return=20"Sort";=20break;=0A= +=09=09case=20T_IncrementalSort:=20return=20"IncrementalSort";=20break;=0A= +=09=09case=20T_Group:=20return=20"Group";=20break;=0A+=09=09case=20= T_Agg:=20return=20"Agg";=20break;=0A+=09=09case=20T_WindowAgg:=20return=20= "WindowAgg";=20break;=0A+=09=09case=20T_Unique:=20return=20"Unique";=20= break;=0A+=09=09case=20T_Gather:=20return=20"Gather";=20break;=0A+=09=09= case=20T_GatherMerge:=20return=20"GatherMerge";=20break;=0A+=09=09case=20= T_Hash:=20return=20"Hash";=20break;=0A+=09=09case=20T_SetOp:=20return=20= "SetOp";=20break;=0A+=09=09case=20T_LockRows:=20return=20"LockRows";=20= break;=0A+=09=09case=20T_Limit:=20return=20"Limit";=20break;=0A+=09=09= case=20T_NestLoopParam:=20return=20"NestLoopParam";=20break;=0A+=09=09= case=20T_PlanRowMark:=20return=20"PlanRowMark";=20break;=0A+=09=09case=20= T_PartitionPruneInfo:=20return=20"PartitionPruneInfo";=20break;=0A+=09=09= case=20T_PartitionedRelPruneInfo:=20return=20"PartitionedRelPruneInfo";=20= break;=0A+=09=09case=20T_PartitionPruneStepOp:=20return=20= "PartitionPruneStepOp";=20break;=0A+=09=09case=20= T_PartitionPruneStepCombine:=20return=20"PartitionPruneStepCombine";=20= break;=0A+=09=09case=20T_PlanInvalItem:=20return=20"PlanInvalItem";=20= break;=0A+=09=09case=20T_PlanState:=20return=20"PlanState";=20break;=0A+=09= =09case=20T_ResultState:=20return=20"ResultState";=20break;=0A+=09=09= case=20T_ProjectSetState:=20return=20"ProjectSetState";=20break;=0A+=09=09= case=20T_ModifyTableState:=20return=20"ModifyTableState";=20break;=0A+=09= =09case=20T_AppendState:=20return=20"AppendState";=20break;=0A+=09=09= case=20T_MergeAppendState:=20return=20"MergeAppendState";=20break;=0A+=09= =09case=20T_RecursiveUnionState:=20return=20"RecursiveUnionState";=20= break;=0A+=09=09case=20T_BitmapAndState:=20return=20"BitmapAndState";=20= break;=0A+=09=09case=20T_BitmapOrState:=20return=20"BitmapOrState";=20= break;=0A+=09=09case=20T_ScanState:=20return=20"ScanState";=20break;=0A+=09= =09case=20T_SeqScanState:=20return=20"SeqScanState";=20break;=0A+=09=09= case=20T_SampleScanState:=20return=20"SampleScanState";=20break;=0A+=09=09= case=20T_IndexScanState:=20return=20"IndexScanState";=20break;=0A+=09=09= case=20T_IndexOnlyScanState:=20return=20"IndexOnlyScanState";=20break;=0A= +=09=09case=20T_BitmapIndexScanState:=20return=20"BitmapIndexScanState";=20= break;=0A+=09=09case=20T_BitmapHeapScanState:=20return=20= "BitmapHeapScanState";=20break;=0A+=09=09case=20T_TidScanState:=20return=20= "TidScanState";=20break;=0A+=09=09case=20T_TidRangeScanState:=20return=20= "TidRangeScanState";=20break;=0A+=09=09case=20T_SubqueryScanState:=20= return=20"SubqueryScanState";=20break;=0A+=09=09case=20= T_FunctionScanState:=20return=20"FunctionScanState";=20break;=0A+=09=09= case=20T_TableFuncScanState:=20return=20"TableFuncScanState";=20break;=0A= +=09=09case=20T_ValuesScanState:=20return=20"ValuesScanState";=20break;=0A= +=09=09case=20T_CteScanState:=20return=20"CteScanState";=20break;=0A+=09=09= case=20T_NamedTuplestoreScanState:=20return=20= "NamedTuplestoreScanState";=20break;=0A+=09=09case=20= T_WorkTableScanState:=20return=20"WorkTableScanState";=20break;=0A+=09=09= case=20T_ForeignScanState:=20return=20"ForeignScanState";=20break;=0A+=09= =09case=20T_CustomScanState:=20return=20"CustomScanState";=20break;=0A+=09= =09case=20T_JoinState:=20return=20"JoinState";=20break;=0A+=09=09case=20= T_NestLoopState:=20return=20"NestLoopState";=20break;=0A+=09=09case=20= T_MergeJoinState:=20return=20"MergeJoinState";=20break;=0A+=09=09case=20= T_HashJoinState:=20return=20"HashJoinState";=20break;=0A+=09=09case=20= T_MaterialState:=20return=20"MaterialState";=20break;=0A+=09=09case=20= T_MemoizeState:=20return=20"MemoizeState";=20break;=0A+=09=09case=20= T_SortState:=20return=20"SortState";=20break;=0A+=09=09case=20= T_IncrementalSortState:=20return=20"IncrementalSortState";=20break;=0A+=09= =09case=20T_GroupState:=20return=20"GroupState";=20break;=0A+=09=09case=20= T_AggState:=20return=20"AggState";=20break;=0A+=09=09case=20= T_WindowAggState:=20return=20"WindowAggState";=20break;=0A+=09=09case=20= T_UniqueState:=20return=20"UniqueState";=20break;=0A+=09=09case=20= T_GatherState:=20return=20"GatherState";=20break;=0A+=09=09case=20= T_GatherMergeState:=20return=20"GatherMergeState";=20break;=0A+=09=09= case=20T_HashState:=20return=20"HashState";=20break;=0A+=09=09case=20= T_SetOpState:=20return=20"SetOpState";=20break;=0A+=09=09case=20= T_LockRowsState:=20return=20"LockRowsState";=20break;=0A+=09=09case=20= T_LimitState:=20return=20"LimitState";=20break;=0A+=09=09case=20T_Alias:=20= return=20"Alias";=20break;=0A+=09=09case=20T_RangeVar:=20return=20= "RangeVar";=20break;=0A+=09=09case=20T_TableFunc:=20return=20= "TableFunc";=20break;=0A+=09=09case=20T_Var:=20return=20"Var";=20break;=0A= +=09=09case=20T_Const:=20return=20"Const";=20break;=0A+=09=09case=20= T_Param:=20return=20"Param";=20break;=0A+=09=09case=20T_Aggref:=20return=20= "Aggref";=20break;=0A+=09=09case=20T_GroupingFunc:=20return=20= "GroupingFunc";=20break;=0A+=09=09case=20T_WindowFunc:=20return=20= "WindowFunc";=20break;=0A+=09=09case=20T_SubscriptingRef:=20return=20= "SubscriptingRef";=20break;=0A+=09=09case=20T_FuncExpr:=20return=20= "FuncExpr";=20break;=0A+=09=09case=20T_NamedArgExpr:=20return=20= "NamedArgExpr";=20break;=0A+=09=09case=20T_OpExpr:=20return=20"OpExpr";=20= break;=0A+=09=09case=20T_DistinctExpr:=20return=20"DistinctExpr";=20= break;=0A+=09=09case=20T_NullIfExpr:=20return=20"NullIfExpr";=20break;=0A= +=09=09case=20T_ScalarArrayOpExpr:=20return=20"ScalarArrayOpExpr";=20= break;=0A+=09=09case=20T_BoolExpr:=20return=20"BoolExpr";=20break;=0A+=09= =09case=20T_SubLink:=20return=20"SubLink";=20break;=0A+=09=09case=20= T_SubPlan:=20return=20"SubPlan";=20break;=0A+=09=09case=20= T_AlternativeSubPlan:=20return=20"AlternativeSubPlan";=20break;=0A+=09=09= case=20T_FieldSelect:=20return=20"FieldSelect";=20break;=0A+=09=09case=20= T_FieldStore:=20return=20"FieldStore";=20break;=0A+=09=09case=20= T_RelabelType:=20return=20"RelabelType";=20break;=0A+=09=09case=20= T_CoerceViaIO:=20return=20"CoerceViaIO";=20break;=0A+=09=09case=20= T_ArrayCoerceExpr:=20return=20"ArrayCoerceExpr";=20break;=0A+=09=09case=20= T_ConvertRowtypeExpr:=20return=20"ConvertRowtypeExpr";=20break;=0A+=09=09= case=20T_CollateExpr:=20return=20"CollateExpr";=20break;=0A+=09=09case=20= T_CaseExpr:=20return=20"CaseExpr";=20break;=0A+=09=09case=20T_CaseWhen:=20= return=20"CaseWhen";=20break;=0A+=09=09case=20T_CaseTestExpr:=20return=20= "CaseTestExpr";=20break;=0A+=09=09case=20T_ArrayExpr:=20return=20= "ArrayExpr";=20break;=0A+=09=09case=20T_RowExpr:=20return=20"RowExpr";=20= break;=0A+=09=09case=20T_RowCompareExpr:=20return=20"RowCompareExpr";=20= break;=0A+=09=09case=20T_CoalesceExpr:=20return=20"CoalesceExpr";=20= break;=0A+=09=09case=20T_MinMaxExpr:=20return=20"MinMaxExpr";=20break;=0A= +=09=09case=20T_SQLValueFunction:=20return=20"SQLValueFunction";=20= break;=0A+=09=09case=20T_XmlExpr:=20return=20"XmlExpr";=20break;=0A+=09=09= case=20T_NullTest:=20return=20"NullTest";=20break;=0A+=09=09case=20= T_BooleanTest:=20return=20"BooleanTest";=20break;=0A+=09=09case=20= T_CoerceToDomain:=20return=20"CoerceToDomain";=20break;=0A+=09=09case=20= T_CoerceToDomainValue:=20return=20"CoerceToDomainValue";=20break;=0A+=09=09= case=20T_SetToDefault:=20return=20"SetToDefault";=20break;=0A+=09=09case=20= T_CurrentOfExpr:=20return=20"CurrentOfExpr";=20break;=0A+=09=09case=20= T_NextValueExpr:=20return=20"NextValueExpr";=20break;=0A+=09=09case=20= T_InferenceElem:=20return=20"InferenceElem";=20break;=0A+=09=09case=20= T_TargetEntry:=20return=20"TargetEntry";=20break;=0A+=09=09case=20= T_RangeTblRef:=20return=20"RangeTblRef";=20break;=0A+=09=09case=20= T_JoinExpr:=20return=20"JoinExpr";=20break;=0A+=09=09case=20T_FromExpr:=20= return=20"FromExpr";=20break;=0A+=09=09case=20T_OnConflictExpr:=20return=20= "OnConflictExpr";=20break;=0A+=09=09case=20T_IntoClause:=20return=20= "IntoClause";=20break;=0A+=09=09case=20T_ExprState:=20return=20= "ExprState";=20break;=0A+=09=09case=20T_WindowFuncExprState:=20return=20= "WindowFuncExprState";=20break;=0A+=09=09case=20T_SetExprState:=20return=20= "SetExprState";=20break;=0A+=09=09case=20T_SubPlanState:=20return=20= "SubPlanState";=20break;=0A+=09=09case=20T_DomainConstraintState:=20= return=20"DomainConstraintState";=20break;=0A+=09=09case=20= T_PlannerInfo:=20return=20"PlannerInfo";=20break;=0A+=09=09case=20= T_PlannerGlobal:=20return=20"PlannerGlobal";=20break;=0A+=09=09case=20= T_RelOptInfo:=20return=20"RelOptInfo";=20break;=0A+=09=09case=20= T_IndexOptInfo:=20return=20"IndexOptInfo";=20break;=0A+=09=09case=20= T_ForeignKeyOptInfo:=20return=20"ForeignKeyOptInfo";=20break;=0A+=09=09= case=20T_ParamPathInfo:=20return=20"ParamPathInfo";=20break;=0A+=09=09= case=20T_Path:=20return=20"Path";=20break;=0A+=09=09case=20T_IndexPath:=20= return=20"IndexPath";=20break;=0A+=09=09case=20T_BitmapHeapPath:=20= return=20"BitmapHeapPath";=20break;=0A+=09=09case=20T_BitmapAndPath:=20= return=20"BitmapAndPath";=20break;=0A+=09=09case=20T_BitmapOrPath:=20= return=20"BitmapOrPath";=20break;=0A+=09=09case=20T_TidPath:=20return=20= "TidPath";=20break;=0A+=09=09case=20T_TidRangePath:=20return=20= "TidRangePath";=20break;=0A+=09=09case=20T_SubqueryScanPath:=20return=20= "SubqueryScanPath";=20break;=0A+=09=09case=20T_ForeignPath:=20return=20= "ForeignPath";=20break;=0A+=09=09case=20T_CustomPath:=20return=20= "CustomPath";=20break;=0A+=09=09case=20T_NestPath:=20return=20= "NestPath";=20break;=0A+=09=09case=20T_MergePath:=20return=20= "MergePath";=20break;=0A+=09=09case=20T_HashPath:=20return=20"HashPath";=20= break;=0A+=09=09case=20T_AppendPath:=20return=20"AppendPath";=20break;=0A= +=09=09case=20T_MergeAppendPath:=20return=20"MergeAppendPath";=20break;=0A= +=09=09case=20T_GroupResultPath:=20return=20"GroupResultPath";=20break;=0A= +=09=09case=20T_MaterialPath:=20return=20"MaterialPath";=20break;=0A+=09=09= case=20T_MemoizePath:=20return=20"MemoizePath";=20break;=0A+=09=09case=20= T_UniquePath:=20return=20"UniquePath";=20break;=0A+=09=09case=20= T_GatherPath:=20return=20"GatherPath";=20break;=0A+=09=09case=20= T_GatherMergePath:=20return=20"GatherMergePath";=20break;=0A+=09=09case=20= T_ProjectionPath:=20return=20"ProjectionPath";=20break;=0A+=09=09case=20= T_ProjectSetPath:=20return=20"ProjectSetPath";=20break;=0A+=09=09case=20= T_SortPath:=20return=20"SortPath";=20break;=0A+=09=09case=20= T_IncrementalSortPath:=20return=20"IncrementalSortPath";=20break;=0A+=09=09= case=20T_GroupPath:=20return=20"GroupPath";=20break;=0A+=09=09case=20= T_UpperUniquePath:=20return=20"UpperUniquePath";=20break;=0A+=09=09case=20= T_AggPath:=20return=20"AggPath";=20break;=0A+=09=09case=20= T_GroupingSetsPath:=20return=20"GroupingSetsPath";=20break;=0A+=09=09= case=20T_MinMaxAggPath:=20return=20"MinMaxAggPath";=20break;=0A+=09=09= case=20T_WindowAggPath:=20return=20"WindowAggPath";=20break;=0A+=09=09= case=20T_SetOpPath:=20return=20"SetOpPath";=20break;=0A+=09=09case=20= T_RecursiveUnionPath:=20return=20"RecursiveUnionPath";=20break;=0A+=09=09= case=20T_LockRowsPath:=20return=20"LockRowsPath";=20break;=0A+=09=09case=20= T_ModifyTablePath:=20return=20"ModifyTablePath";=20break;=0A+=09=09case=20= T_LimitPath:=20return=20"LimitPath";=20break;=0A+=09=09case=20= T_EquivalenceClass:=20return=20"EquivalenceClass";=20break;=0A+=09=09= case=20T_EquivalenceMember:=20return=20"EquivalenceMember";=20break;=0A+=09= =09case=20T_PathKey:=20return=20"PathKey";=20break;=0A+=09=09case=20= T_PathTarget:=20return=20"PathTarget";=20break;=0A+=09=09case=20= T_RestrictInfo:=20return=20"RestrictInfo";=20break;=0A+=09=09case=20= T_IndexClause:=20return=20"IndexClause";=20break;=0A+=09=09case=20= T_PlaceHolderVar:=20return=20"PlaceHolderVar";=20break;=0A+=09=09case=20= T_SpecialJoinInfo:=20return=20"SpecialJoinInfo";=20break;=0A+=09=09case=20= T_AppendRelInfo:=20return=20"AppendRelInfo";=20break;=0A+=09=09case=20= T_RowIdentityVarInfo:=20return=20"RowIdentityVarInfo";=20break;=0A+=09=09= case=20T_PlaceHolderInfo:=20return=20"PlaceHolderInfo";=20break;=0A+=09=09= case=20T_MinMaxAggInfo:=20return=20"MinMaxAggInfo";=20break;=0A+=09=09= case=20T_PlannerParamItem:=20return=20"PlannerParamItem";=20break;=0A+=09= =09case=20T_RollupData:=20return=20"RollupData";=20break;=0A+=09=09case=20= T_GroupingSetData:=20return=20"GroupingSetData";=20break;=0A+=09=09case=20= T_StatisticExtInfo:=20return=20"StatisticExtInfo";=20break;=0A+=09=09= case=20T_AllocSetContext:=20return=20"AllocSetContext";=20break;=0A+=09=09= case=20T_SlabContext:=20return=20"SlabContext";=20break;=0A+=09=09case=20= T_GenerationContext:=20return=20"GenerationContext";=20break;=0A+=09=09= case=20T_Integer:=20return=20"Integer";=20break;=0A+=09=09case=20= T_Float:=20return=20"Float";=20break;=0A+=09=09case=20T_Boolean:=20= return=20"Boolean";=20break;=0A+=09=09case=20T_String:=20return=20= "String";=20break;=0A+=09=09case=20T_BitString:=20return=20"BitString";=20= break;=0A+=09=09case=20T_List:=20return=20"List";=20break;=0A+=09=09case=20= T_IntList:=20return=20"IntList";=20break;=0A+=09=09case=20T_OidList:=20= return=20"OidList";=20break;=0A+=09=09case=20T_ExtensibleNode:=20return=20= "ExtensibleNode";=20break;=0A+=09=09case=20T_RawStmt:=20return=20= "RawStmt";=20break;=0A+=09=09case=20T_Query:=20return=20"Query";=20= break;=0A+=09=09case=20T_PlannedStmt:=20return=20"PlannedStmt";=20break;=0A= +=09=09case=20T_InsertStmt:=20return=20"InsertStmt";=20break;=0A+=09=09= case=20T_DeleteStmt:=20return=20"DeleteStmt";=20break;=0A+=09=09case=20= T_UpdateStmt:=20return=20"UpdateStmt";=20break;=0A+=09=09case=20= T_SelectStmt:=20return=20"SelectStmt";=20break;=0A+=09=09case=20= T_ReturnStmt:=20return=20"ReturnStmt";=20break;=0A+=09=09case=20= T_PLAssignStmt:=20return=20"PLAssignStmt";=20break;=0A+=09=09case=20= T_AlterTableStmt:=20return=20"AlterTableStmt";=20break;=0A+=09=09case=20= T_AlterTableCmd:=20return=20"AlterTableCmd";=20break;=0A+=09=09case=20= T_AlterDomainStmt:=20return=20"AlterDomainStmt";=20break;=0A+=09=09case=20= T_SetOperationStmt:=20return=20"SetOperationStmt";=20break;=0A+=09=09= case=20T_GrantStmt:=20return=20"GrantStmt";=20break;=0A+=09=09case=20= T_GrantRoleStmt:=20return=20"GrantRoleStmt";=20break;=0A+=09=09case=20= T_AlterDefaultPrivilegesStmt:=20return=20"AlterDefaultPrivilegesStmt";=20= break;=0A+=09=09case=20T_ClosePortalStmt:=20return=20"ClosePortalStmt";=20= break;=0A+=09=09case=20T_ClusterStmt:=20return=20"ClusterStmt";=20break;=0A= +=09=09case=20T_CopyStmt:=20return=20"CopyStmt";=20break;=0A+=09=09case=20= T_CreateStmt:=20return=20"CreateStmt";=20break;=0A+=09=09case=20= T_DefineStmt:=20return=20"DefineStmt";=20break;=0A+=09=09case=20= T_DropStmt:=20return=20"DropStmt";=20break;=0A+=09=09case=20= T_TruncateStmt:=20return=20"TruncateStmt";=20break;=0A+=09=09case=20= T_CommentStmt:=20return=20"CommentStmt";=20break;=0A+=09=09case=20= T_FetchStmt:=20return=20"FetchStmt";=20break;=0A+=09=09case=20= T_IndexStmt:=20return=20"IndexStmt";=20break;=0A+=09=09case=20= T_CreateFunctionStmt:=20return=20"CreateFunctionStmt";=20break;=0A+=09=09= case=20T_AlterFunctionStmt:=20return=20"AlterFunctionStmt";=20break;=0A+=09= =09case=20T_DoStmt:=20return=20"DoStmt";=20break;=0A+=09=09case=20= T_RenameStmt:=20return=20"RenameStmt";=20break;=0A+=09=09case=20= T_RuleStmt:=20return=20"RuleStmt";=20break;=0A+=09=09case=20= T_NotifyStmt:=20return=20"NotifyStmt";=20break;=0A+=09=09case=20= T_ListenStmt:=20return=20"ListenStmt";=20break;=0A+=09=09case=20= T_UnlistenStmt:=20return=20"UnlistenStmt";=20break;=0A+=09=09case=20= T_TransactionStmt:=20return=20"TransactionStmt";=20break;=0A+=09=09case=20= T_ViewStmt:=20return=20"ViewStmt";=20break;=0A+=09=09case=20T_LoadStmt:=20= return=20"LoadStmt";=20break;=0A+=09=09case=20T_CreateDomainStmt:=20= return=20"CreateDomainStmt";=20break;=0A+=09=09case=20T_CreatedbStmt:=20= return=20"CreatedbStmt";=20break;=0A+=09=09case=20T_DropdbStmt:=20return=20= "DropdbStmt";=20break;=0A+=09=09case=20T_VacuumStmt:=20return=20= "VacuumStmt";=20break;=0A+=09=09case=20T_ExplainStmt:=20return=20= "ExplainStmt";=20break;=0A+=09=09case=20T_CreateTableAsStmt:=20return=20= "CreateTableAsStmt";=20break;=0A+=09=09case=20T_CreateSeqStmt:=20return=20= "CreateSeqStmt";=20break;=0A+=09=09case=20T_AlterSeqStmt:=20return=20= "AlterSeqStmt";=20break;=0A+=09=09case=20T_VariableSetStmt:=20return=20= "VariableSetStmt";=20break;=0A+=09=09case=20T_VariableShowStmt:=20return=20= "VariableShowStmt";=20break;=0A+=09=09case=20T_DiscardStmt:=20return=20= "DiscardStmt";=20break;=0A+=09=09case=20T_CreateTrigStmt:=20return=20= "CreateTrigStmt";=20break;=0A+=09=09case=20T_CreatePLangStmt:=20return=20= "CreatePLangStmt";=20break;=0A+=09=09case=20T_CreateRoleStmt:=20return=20= "CreateRoleStmt";=20break;=0A+=09=09case=20T_AlterRoleStmt:=20return=20= "AlterRoleStmt";=20break;=0A+=09=09case=20T_DropRoleStmt:=20return=20= "DropRoleStmt";=20break;=0A+=09=09case=20T_LockStmt:=20return=20= "LockStmt";=20break;=0A+=09=09case=20T_ConstraintsSetStmt:=20return=20= "ConstraintsSetStmt";=20break;=0A+=09=09case=20T_ReindexStmt:=20return=20= "ReindexStmt";=20break;=0A+=09=09case=20T_CheckPointStmt:=20return=20= "CheckPointStmt";=20break;=0A+=09=09case=20T_CreateSchemaStmt:=20return=20= "CreateSchemaStmt";=20break;=0A+=09=09case=20T_AlterDatabaseStmt:=20= return=20"AlterDatabaseStmt";=20break;=0A+=09=09case=20= T_AlterDatabaseRefreshCollStmt:=20return=20= "AlterDatabaseRefreshCollStmt";=20break;=0A+=09=09case=20= T_AlterDatabaseSetStmt:=20return=20"AlterDatabaseSetStmt";=20break;=0A+=09= =09case=20T_AlterRoleSetStmt:=20return=20"AlterRoleSetStmt";=20break;=0A= +=09=09case=20T_CreateConversionStmt:=20return=20"CreateConversionStmt";=20= break;=0A+=09=09case=20T_CreateCastStmt:=20return=20"CreateCastStmt";=20= break;=0A+=09=09case=20T_CreateOpClassStmt:=20return=20= "CreateOpClassStmt";=20break;=0A+=09=09case=20T_CreateOpFamilyStmt:=20= return=20"CreateOpFamilyStmt";=20break;=0A+=09=09case=20= T_AlterOpFamilyStmt:=20return=20"AlterOpFamilyStmt";=20break;=0A+=09=09= case=20T_PrepareStmt:=20return=20"PrepareStmt";=20break;=0A+=09=09case=20= T_ExecuteStmt:=20return=20"ExecuteStmt";=20break;=0A+=09=09case=20= T_DeallocateStmt:=20return=20"DeallocateStmt";=20break;=0A+=09=09case=20= T_DeclareCursorStmt:=20return=20"DeclareCursorStmt";=20break;=0A+=09=09= case=20T_CreateTableSpaceStmt:=20return=20"CreateTableSpaceStmt";=20= break;=0A+=09=09case=20T_DropTableSpaceStmt:=20return=20= "DropTableSpaceStmt";=20break;=0A+=09=09case=20T_AlterObjectDependsStmt:=20= return=20"AlterObjectDependsStmt";=20break;=0A+=09=09case=20= T_AlterObjectSchemaStmt:=20return=20"AlterObjectSchemaStmt";=20break;=0A= +=09=09case=20T_AlterOwnerStmt:=20return=20"AlterOwnerStmt";=20break;=0A= +=09=09case=20T_AlterOperatorStmt:=20return=20"AlterOperatorStmt";=20= break;=0A+=09=09case=20T_AlterTypeStmt:=20return=20"AlterTypeStmt";=20= break;=0A+=09=09case=20T_DropOwnedStmt:=20return=20"DropOwnedStmt";=20= break;=0A+=09=09case=20T_ReassignOwnedStmt:=20return=20= "ReassignOwnedStmt";=20break;=0A+=09=09case=20T_CompositeTypeStmt:=20= return=20"CompositeTypeStmt";=20break;=0A+=09=09case=20T_CreateEnumStmt:=20= return=20"CreateEnumStmt";=20break;=0A+=09=09case=20T_CreateRangeStmt:=20= return=20"CreateRangeStmt";=20break;=0A+=09=09case=20T_AlterEnumStmt:=20= return=20"AlterEnumStmt";=20break;=0A+=09=09case=20= T_AlterTSDictionaryStmt:=20return=20"AlterTSDictionaryStmt";=20break;=0A= +=09=09case=20T_AlterTSConfigurationStmt:=20return=20= "AlterTSConfigurationStmt";=20break;=0A+=09=09case=20T_CreateFdwStmt:=20= return=20"CreateFdwStmt";=20break;=0A+=09=09case=20T_AlterFdwStmt:=20= return=20"AlterFdwStmt";=20break;=0A+=09=09case=20= T_CreateForeignServerStmt:=20return=20"CreateForeignServerStmt";=20= break;=0A+=09=09case=20T_AlterForeignServerStmt:=20return=20= "AlterForeignServerStmt";=20break;=0A+=09=09case=20= T_CreateUserMappingStmt:=20return=20"CreateUserMappingStmt";=20break;=0A= +=09=09case=20T_AlterUserMappingStmt:=20return=20"AlterUserMappingStmt";=20= break;=0A+=09=09case=20T_DropUserMappingStmt:=20return=20= "DropUserMappingStmt";=20break;=0A+=09=09case=20= T_AlterTableSpaceOptionsStmt:=20return=20"AlterTableSpaceOptionsStmt";=20= break;=0A+=09=09case=20T_AlterTableMoveAllStmt:=20return=20= "AlterTableMoveAllStmt";=20break;=0A+=09=09case=20T_SecLabelStmt:=20= return=20"SecLabelStmt";=20break;=0A+=09=09case=20= T_CreateForeignTableStmt:=20return=20"CreateForeignTableStmt";=20break;=0A= +=09=09case=20T_ImportForeignSchemaStmt:=20return=20= "ImportForeignSchemaStmt";=20break;=0A+=09=09case=20= T_CreateExtensionStmt:=20return=20"CreateExtensionStmt";=20break;=0A+=09=09= case=20T_AlterExtensionStmt:=20return=20"AlterExtensionStmt";=20break;=0A= +=09=09case=20T_AlterExtensionContentsStmt:=20return=20= "AlterExtensionContentsStmt";=20break;=0A+=09=09case=20= T_CreateEventTrigStmt:=20return=20"CreateEventTrigStmt";=20break;=0A+=09=09= case=20T_AlterEventTrigStmt:=20return=20"AlterEventTrigStmt";=20break;=0A= +=09=09case=20T_RefreshMatViewStmt:=20return=20"RefreshMatViewStmt";=20= break;=0A+=09=09case=20T_ReplicaIdentityStmt:=20return=20= "ReplicaIdentityStmt";=20break;=0A+=09=09case=20T_AlterSystemStmt:=20= return=20"AlterSystemStmt";=20break;=0A+=09=09case=20T_CreatePolicyStmt:=20= return=20"CreatePolicyStmt";=20break;=0A+=09=09case=20T_AlterPolicyStmt:=20= return=20"AlterPolicyStmt";=20break;=0A+=09=09case=20= T_CreateTransformStmt:=20return=20"CreateTransformStmt";=20break;=0A+=09=09= case=20T_CreateAmStmt:=20return=20"CreateAmStmt";=20break;=0A+=09=09case=20= T_CreatePublicationStmt:=20return=20"CreatePublicationStmt";=20break;=0A= +=09=09case=20T_AlterPublicationStmt:=20return=20"AlterPublicationStmt";=20= break;=0A+=09=09case=20T_CreateSubscriptionStmt:=20return=20= "CreateSubscriptionStmt";=20break;=0A+=09=09case=20= T_AlterSubscriptionStmt:=20return=20"AlterSubscriptionStmt";=20break;=0A= +=09=09case=20T_DropSubscriptionStmt:=20return=20"DropSubscriptionStmt";=20= break;=0A+=09=09case=20T_CreateStatsStmt:=20return=20"CreateStatsStmt";=20= break;=0A+=09=09case=20T_AlterCollationStmt:=20return=20= "AlterCollationStmt";=20break;=0A+=09=09case=20T_CallStmt:=20return=20= "CallStmt";=20break;=0A+=09=09case=20T_AlterStatsStmt:=20return=20= "AlterStatsStmt";=20break;=0A+=09=09case=20T_A_Expr:=20return=20= "A_Expr";=20break;=0A+=09=09case=20T_ColumnRef:=20return=20"ColumnRef";=20= break;=0A+=09=09case=20T_ParamRef:=20return=20"ParamRef";=20break;=0A+=09= =09case=20T_A_Const:=20return=20"A_Const";=20break;=0A+=09=09case=20= T_FuncCall:=20return=20"FuncCall";=20break;=0A+=09=09case=20T_A_Star:=20= return=20"A_Star";=20break;=0A+=09=09case=20T_A_Indices:=20return=20= "A_Indices";=20break;=0A+=09=09case=20T_A_Indirection:=20return=20= "A_Indirection";=20break;=0A+=09=09case=20T_A_ArrayExpr:=20return=20= "A_ArrayExpr";=20break;=0A+=09=09case=20T_ResTarget:=20return=20= "ResTarget";=20break;=0A+=09=09case=20T_MultiAssignRef:=20return=20= "MultiAssignRef";=20break;=0A+=09=09case=20T_TypeCast:=20return=20= "TypeCast";=20break;=0A+=09=09case=20T_CollateClause:=20return=20= "CollateClause";=20break;=0A+=09=09case=20T_SortBy:=20return=20"SortBy";=20= break;=0A+=09=09case=20T_WindowDef:=20return=20"WindowDef";=20break;=0A+=09= =09case=20T_RangeSubselect:=20return=20"RangeSubselect";=20break;=0A+=09=09= case=20T_RangeFunction:=20return=20"RangeFunction";=20break;=0A+=09=09= case=20T_RangeTableSample:=20return=20"RangeTableSample";=20break;=0A+=09= =09case=20T_RangeTableFunc:=20return=20"RangeTableFunc";=20break;=0A+=09=09= case=20T_RangeTableFuncCol:=20return=20"RangeTableFuncCol";=20break;=0A+=09= =09case=20T_TypeName:=20return=20"TypeName";=20break;=0A+=09=09case=20= T_ColumnDef:=20return=20"ColumnDef";=20break;=0A+=09=09case=20= T_IndexElem:=20return=20"IndexElem";=20break;=0A+=09=09case=20= T_StatsElem:=20return=20"StatsElem";=20break;=0A+=09=09case=20= T_Constraint:=20return=20"Constraint";=20break;=0A+=09=09case=20= T_DefElem:=20return=20"DefElem";=20break;=0A+=09=09case=20= T_RangeTblEntry:=20return=20"RangeTblEntry";=20break;=0A+=09=09case=20= T_RangeTblFunction:=20return=20"RangeTblFunction";=20break;=0A+=09=09= case=20T_TableSampleClause:=20return=20"TableSampleClause";=20break;=0A+=09= =09case=20T_WithCheckOption:=20return=20"WithCheckOption";=20break;=0A+=09= =09case=20T_SortGroupClause:=20return=20"SortGroupClause";=20break;=0A+=09= =09case=20T_GroupingSet:=20return=20"GroupingSet";=20break;=0A+=09=09= case=20T_WindowClause:=20return=20"WindowClause";=20break;=0A+=09=09case=20= T_ObjectWithArgs:=20return=20"ObjectWithArgs";=20break;=0A+=09=09case=20= T_AccessPriv:=20return=20"AccessPriv";=20break;=0A+=09=09case=20= T_CreateOpClassItem:=20return=20"CreateOpClassItem";=20break;=0A+=09=09= case=20T_TableLikeClause:=20return=20"TableLikeClause";=20break;=0A+=09=09= case=20T_FunctionParameter:=20return=20"FunctionParameter";=20break;=0A+=09= =09case=20T_LockingClause:=20return=20"LockingClause";=20break;=0A+=09=09= case=20T_RowMarkClause:=20return=20"RowMarkClause";=20break;=0A+=09=09= case=20T_XmlSerialize:=20return=20"XmlSerialize";=20break;=0A+=09=09case=20= T_WithClause:=20return=20"WithClause";=20break;=0A+=09=09case=20= T_InferClause:=20return=20"InferClause";=20break;=0A+=09=09case=20= T_OnConflictClause:=20return=20"OnConflictClause";=20break;=0A+=09=09= case=20T_CTESearchClause:=20return=20"CTESearchClause";=20break;=0A+=09=09= case=20T_CTECycleClause:=20return=20"CTECycleClause";=20break;=0A+=09=09= case=20T_CommonTableExpr:=20return=20"CommonTableExpr";=20break;=0A+=09=09= case=20T_RoleSpec:=20return=20"RoleSpec";=20break;=0A+=09=09case=20= T_TriggerTransition:=20return=20"TriggerTransition";=20break;=0A+=09=09= case=20T_PartitionElem:=20return=20"PartitionElem";=20break;=0A+=09=09= case=20T_PartitionSpec:=20return=20"PartitionSpec";=20break;=0A+=09=09= case=20T_PartitionBoundSpec:=20return=20"PartitionBoundSpec";=20break;=0A= +=09=09case=20T_PartitionRangeDatum:=20return=20"PartitionRangeDatum";=20= break;=0A+=09=09case=20T_PartitionCmd:=20return=20"PartitionCmd";=20= break;=0A+=09=09case=20T_VacuumRelation:=20return=20"VacuumRelation";=20= break;=0A+=09=09case=20T_PublicationObjSpec:=20return=20= "PublicationObjSpec";=20break;=0A+=09=09case=20T_PublicationTable:=20= return=20"PublicationTable";=20break;=0A+=09=09case=20= T_IdentifySystemCmd:=20return=20"IdentifySystemCmd";=20break;=0A+=09=09= case=20T_BaseBackupCmd:=20return=20"BaseBackupCmd";=20break;=0A+=09=09= case=20T_CreateReplicationSlotCmd:=20return=20= "CreateReplicationSlotCmd";=20break;=0A+=09=09case=20= T_DropReplicationSlotCmd:=20return=20"DropReplicationSlotCmd";=20break;=0A= +=09=09case=20T_ReadReplicationSlotCmd:=20return=20= "ReadReplicationSlotCmd";=20break;=0A+=09=09case=20= T_StartReplicationCmd:=20return=20"StartReplicationCmd";=20break;=0A+=09=09= case=20T_TimeLineHistoryCmd:=20return=20"TimeLineHistoryCmd";=20break;=0A= +=09=09case=20T_TriggerData:=20return=20"TriggerData";=20break;=0A+=09=09= case=20T_EventTriggerData:=20return=20"EventTriggerData";=20break;=0A+=09= =09case=20T_ReturnSetInfo:=20return=20"ReturnSetInfo";=20break;=0A+=09=09= case=20T_WindowObjectData:=20return=20"WindowObjectData";=20break;=0A+=09= =09case=20T_TIDBitmap:=20return=20"TIDBitmap";=20break;=0A+=09=09case=20= T_InlineCodeBlock:=20return=20"InlineCodeBlock";=20break;=0A+=09=09case=20= T_FdwRoutine:=20return=20"FdwRoutine";=20break;=0A+=09=09case=20= T_IndexAmRoutine:=20return=20"IndexAmRoutine";=20break;=0A+=09=09case=20= T_TableAmRoutine:=20return=20"TableAmRoutine";=20break;=0A+=09=09case=20= T_TsmRoutine:=20return=20"TsmRoutine";=20break;=0A+=09=09case=20= T_ForeignKeyCacheInfo:=20return=20"ForeignKeyCacheInfo";=20break;=0A+=09=09= case=20T_CallContext:=20return=20"CallContext";=20break;=0A+=09=09case=20= T_SupportRequestSimplify:=20return=20"SupportRequestSimplify";=20break;=0A= +=09=09case=20T_SupportRequestSelectivity:=20return=20= "SupportRequestSelectivity";=20break;=0A+=09=09case=20= T_SupportRequestCost:=20return=20"SupportRequestCost";=20break;=0A+=09=09= case=20T_SupportRequestRows:=20return=20"SupportRequestRows";=20break;=0A= +=09=09case=20T_SupportRequestIndexCondition:=20return=20= "SupportRequestIndexCondition";=20break;=0A+=09=09default:=0A+=09=09=09= break;=0A+=09}=0A+=09return=20"UNRECOGNIZED=20NodeTag";=0A+}=0A+=0A= +static=20char=20*=0A+accesstype_to_string(ObjectAccessType=20access,=20= int=20subId)=0A+{=0A+=09const=20char=20*type;=0A+=0A+=09switch=20= (access)=0A+=09{=0A+=09=09case=20OAT_POST_CREATE:=0A+=09=09=09type=20=3D=20= "create";=0A+=09=09=09break;=0A+=09=09case=20OAT_DROP:=0A+=09=09=09type=20= =3D=20"drop";=0A+=09=09=09break;=0A+=09=09case=20OAT_POST_ALTER:=0A+=09=09= =09type=20=3D=20"alter";=0A+=09=09=09break;=0A+=09=09case=20= OAT_NAMESPACE_SEARCH:=0A+=09=09=09type=20=3D=20"namespace=20search";=0A+=09= =09=09break;=0A+=09=09case=20OAT_FUNCTION_EXECUTE:=0A+=09=09=09type=20=3D=20= "execute";=0A+=09=09=09break;=0A+=09=09case=20OAT_TRUNCATE:=0A+=09=09=09= type=20=3D=20"truncate";=0A+=09=09=09break;=0A+=09=09default:=0A+=09=09=09= type=20=3D=20"UNRECOGNIZED=20ObjectAccessType";=0A+=09}=0A+=0A+=09if=20= (subId=20&=20ACL_SET_VALUE)=0A+=09=09return=20psprintf("%s=20(set)",=20= type);=0A+=09if=20(subId=20&=20ACL_ALTER_SYSTEM)=0A+=09=09return=20= psprintf("%s=20(alter=20system=20set)",=20type);=0A+=0A+=09return=20=20= psprintf("%s=20(subId=3D%d)",=20type,=20subId);=0A+}=0A+=0A+static=20= char=20*=0A+accesstype_arg_to_string(ObjectAccessType=20access,=20void=20= *arg)=0A+{=0A+=09if=20(arg=20=3D=3D=20NULL)=0A+=09=09return=20= pstrdup("extra=20info=20null");=0A+=0A+=09switch=20(access)=0A+=09{=0A+=09= =09case=20OAT_POST_CREATE:=0A+=09=09=09{=0A+=09=09=09=09= ObjectAccessPostCreate=20*pc_arg=20=3D=20(ObjectAccessPostCreate=20= *)arg;=0A+=09=09=09=09return=20pstrdup(pc_arg->is_internal=20?=20= "internal"=20:=20"explicit");=0A+=09=09=09}=0A+=09=09=09break;=0A+=09=09= case=20OAT_DROP:=0A+=09=09=09{=0A+=09=09=09=09ObjectAccessDrop=20= *drop_arg=20=3D=20(ObjectAccessDrop=20*)arg;=0A+=0A+=09=09=09=09return=20= psprintf("%s%s%s%s%s%s",=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"internal=20action,"=20= :=20""),=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"concurrent=20drop,"=20= :=20""),=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"suppress=20= notices,"=20:=20""),=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"keep=20original=20= object,"=20:=20""),=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"keep=20extensions,"=20= :=20""),=0A+=09=09=09=09=09((drop_arg->dropflags=20&=20= PERFORM_DELETION_INTERNAL)=0A+=09=09=09=09=09=09?=20"normal=20concurrent=20= drop,"=20:=20""));=0A+=09=09=09}=0A+=09=09=09break;=0A+=09=09case=20= OAT_POST_ALTER:=0A+=09=09=09{=0A+=09=09=09=09ObjectAccessPostAlter=20= *pa_arg=20=3D=20(ObjectAccessPostAlter*)arg;=0A+=0A+=09=09=09=09return=20= psprintf("%s=20%s=20auxiliary=20object",=0A+=09=09=09=09=09= (pa_arg->is_internal=20?=20"internal"=20:=20"explicit"),=0A+=09=09=09=09=09= (OidIsValid(pa_arg->auxiliary_id)=20?=20"with"=20:=20"without"));=0A+=09=09= =09}=0A+=09=09=09break;=0A+=09=09case=20OAT_NAMESPACE_SEARCH:=0A+=09=09=09= {=0A+=09=09=09=09ObjectAccessNamespaceSearch=20*ns_arg=20=3D=20= (ObjectAccessNamespaceSearch=20*)arg;=0A+=0A+=09=09=09=09return=20= psprintf("%s,=20%s",=0A+=09=09=09=09=09(ns_arg->ereport_on_violation=20?=20= "report=20on=20violation"=20:=20"no=20report=20on=20violation"),=0A+=09=09= =09=09=09(ns_arg->result=20?=20"allowed"=20:=20"denied"));=0A+=09=09=09}=0A= +=09=09=09break;=0A+=09=09case=20OAT_TRUNCATE:=0A+=09=09case=20= OAT_FUNCTION_EXECUTE:=0A+=09=09=09/*=20hook=20takes=20no=20arg.=20*/=0A+=09= =09=09return=20pstrdup("unexpected=20extra=20info=20pointer=20= received");=0A+=09=09default:=0A+=09=09=09return=20pstrdup("cannot=20= parse=20extra=20info=20for=20unrecognized=20access=20type");=0A+=09}=0A+=0A= +=09return=20pstrdup("unknown");=0A+}=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/test_oat_hooks.control=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.control=0Anew=20file=20= mode=20100644=0Aindex=200000000000..3d3cf4a8ac=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.control=0A@@=20-0,0=20= +1,4=20@@=0A+comment=20=3D=20'Test=20code=20for=20Object=20Access=20= hooks'=0A+default_version=20=3D=20'1.0'=0A+module_pathname=20=3D=20= '$libdir/test_oat_hooks'=0A+relocatable=20=3D=20true=0Adiff=20--git=20= a/src/test/modules/test_oat_hooks/test_oat_hooks.h=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.h=0Anew=20file=20mode=20= 100644=0Aindex=200000000000..ff1ee1bf5c=0A---=20/dev/null=0A+++=20= b/src/test/modules/test_oat_hooks/test_oat_hooks.h=0A@@=20-0,0=20+1,25=20= @@=0A= +/*-----------------------------------------------------------------------= ---=0A+=20*=0A+=20*=20test_rls_hooks.h=0A+=20*=09=09Definitions=20for=20= OAT=20hooks=0A+=20*=0A+=20*=20Copyright=20(c)=202015-2022,=20PostgreSQL=20= Global=20Development=20Group=0A+=20*=0A+=20*=20IDENTIFICATION=0A+=20*=09=09= src/test/modules/test_oat_hooks/test_oat_hooks.h=0A+=20*=0A+=20*=20= -------------------------------------------------------------------------=0A= +=20*/=0A+=0A+#ifndef=20TEST_OAT_HOOKS_H=0A+#define=20TEST_OAT_HOOKS_H=0A= +=0A+#include=20=0A+=0A+/*=20Return=20set=20of=20= permissive=20hooks=20based=20on=20CmdType=20and=20Relation=20*/=0A= +extern=20List=20*test_rls_hooks_permissive(CmdType=20cmdtype,=20= Relation=20relation);=0A+=0A+/*=20Return=20set=20of=20restrictive=20= hooks=20based=20on=20CmdType=20and=20Relation=20*/=0A+extern=20List=20= *test_rls_hooks_restrictive(CmdType=20cmdtype,=20Relation=20relation);=0A= +=0A+#endif=09=09=09=09/*=20TEST_OAT_HOOKS_H=20*/=0A--=20=0A2.35.1=0A=0A= --Apple-Mail=_5543C7F7-6C54-42F8-AAB2-9D6FA63CFD16 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 [1] = https://www.postgresql.org/message-id/flat/664799.1647456444%40sss.pgh.pa.= us#c9721c2da88d59684ac7ac5fc36f09c1 =E2=80=94 Mark Dilger EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --Apple-Mail=_5543C7F7-6C54-42F8-AAB2-9D6FA63CFD16--