On Thu, Nov 30, 2023 at 3:59 PM David G. Johnston <david.g.johns...@gmail.com> wrote: > > Extending my prior email which is now redundant. > > On Tue, Oct 3, 2023 at 7:00 PM David G. Johnston <david.g.johns...@gmail.com> > wrote: >> >> On Tue, Oct 3, 2023 at 4:15 PM Karl O. Pinc <k...@karlpinc.com> wrote: >>> >>> On Tue, 3 Oct 2023 14:51:31 -0700 >>> "David G. Johnston" <david.g.johns...@gmail.com> wrote: >>> >>> Isn't the entire section about "deviating from the normal flow of the >>> code"? That's what makes me want "Exception" in the section title. >> >> >> It is about how error handling in a procedure diverts the flow from the >> normal code path to some other code path - what that path is labelled is >> less important than the thing that causes the diversion - an error. >> >>> >>> ? I remain (overly?) focused on the word "exception", since that's >>> whats in the brain of the user that's writing RAISE EXCEPTION. >>> It matters if exceptions and errors are different. If they're >>> not, then it also matters since it's exceptions that the user's >>> code raises. >>> >> >> It's unfortunate the keyword to raise the message level "ERROR" is >> "EXCEPTION" in that command but I'd rather simply handle that one anomaly >> that make the rest of the system use the word exception, especially seem to >> be fairly consistent in our usage of ERROR already. I'm sympathetic that >> other systems out there also encourage the usage of exception in this >> context instead of error - but not to the point of opening up this >> long-standing decision for rework. >> >>> >>> Have you any thoughts on the "permissions", "privleges" and >>> "attributes" vocabulary/concepts used in this area? >> >> >> I think we benefit from being able to equate permissions and privileges and >> trying to separate them is going to be more harmful than helpful. The >> limited things that role attributes permit, and how they fall outside the >> privilege/permission concept as we use it, isn't something that I've noticed >> is a problem that needs addressing. >> >> >>> (I'm slightly >>> nervous about the renumbering making the thread hard to follow.) >>> >> >> 0009 - Something just seems off with this one. Unless there are more places >> with this type in use I would just move the relevant notes (i.e., the one in >> proallargtypes) to that column and be done with it. If there are multiple >> places then moving the notes to the main docs and cross-referencing to them >> seems warranted. I also wouldn't call it legacy. >> >> 0010 - >> >> When creating new objects, if a schema qualification is not given with the >> name the first extant entry in the search_path is chosen; then an error will >> be raised should the supplied name already exist in that schema. >> In contexts where the object must already exist, but its name is not schema >> qualified, the extant search_path schemas will be consulted serially until >> one of them contains an appropriate object, returning it, or all schemas are >> consulted, resulting in an object not found error. >> >> I'm not seeing much value in presenting the additional user/public details >> here. Especially as it would then seem appropriate to include pg_temp. And >> now we have to deal with the fact that by default the public schema isn't so >> public anymore. >> > > 0011 - (first pass, going from memory, might have missed some needed details) > > Aside from non-atomic SQL routine bodies (functions and procedures) the > result of the server executing SQL sent by the connected client does not > result in raw SQL, or textual expressions, being stored for later evaluation. > All objects are identified (or created) during execution and their effects > stored within the system catalogs and assigned system identifiers (oids) to > provide an absolute and immutable reference to be used while establishing > inter-object dependencies. In short, indirect actions taken by the server, > based upon stored knowledge, can and often will execute while in a > search_path that only contains the pg_catalog schema so that the stored > knowledge can be found. > > For routines written in any language except Atomic SQL the textual body of > the routine is stored as-is within the database. When executing such a > routine the (parent) session basically opens up a new connection to the > server (one per routine) and within that new sub-session sends the SQL > contained within the routine to the server for execution just like any other > client, and therefore any object references present in that SQL need to be > resolved to a schema as previously discussed. By default, upon connecting, > the newly created session is updated so that its settings take on the current > values in the parent session. When authoring a routine this is often > undesirable as the behavior of the routine now depends upon an environment > that is not definitively known to the routine author. Schema-qualifying > object references within the routine body is one tool to remove such > uncertainty. Another is by using the SET clause of the relevant CREATE SQL > Command to specify what the value of important settings are to be. > > The key takeaway from the preceding two paragraphs is that because routines > are stored as text and their settings resolved at execution time, and > indirect server actions can invoke those routines with a pg_catalog only > search_path, any routine that potentially can be invoked in that manner and > makes use of search_path should either be modified to eliminate such use or > define the required search_path via the SET option during its creation or > replacement. > > 0012 - (this has changed recently too, I'm not sure how this fits within the > rest. I still feel like something is missing even in my revision but not > sure what or if it is covered sufficiently nearby) > > All roles are ultimately owned and managed by the bootstrap superuser, who > can establish trees of groups and users upon which the object permission > granting system works. By enabling the CREATEROLE attribute on a user a > superuser can delegate role creation to other people (it is inadvisable to > enable CREATEROLE on a group) who can then construct their own trees of > groups and users. > > (not sure how true this is still but something to consider in terms of big > picture role setups) > It is likewise inadvisable to create multiple superusers since in practice > their actions in many cases can be made to look attributable to the bootstrap > superuser. It is necessary to enlist services outside of PostgreSQL to > adequately establish auditing in a multi-superuser setup. > > Note my intentional use of users and groups here. We got rid of the > distinction with CREATE ROLE but in terms of system administration they still > have, IMO, significant utility. > > 0013 - +1 > 0014 - +1 > > 0015 - I'd almost rather only note in CREATE FUNCTION that PARALLEL does not > matter for a trigger returning function as triggers only execute in cases of > data writing which precludes using parallelism. Which is indeed what the > documentation explicitly calls out in "When Can Parallel Query Be Used?" so > it isn't inference from omission. > > I don't have a problem saying in the trigger documentation, maybe at the very > end: > > The functions that triggers execute are more appropriately considered > procedures but since the later feature did not exist when triggers were > implemented precedent compels the dba to write their routines as functions. > As a consequence, function attributes such as PARALLEL, and WINDOW, are > possible to define on a function that is to be used as a trigger but will > have no effect. (though I would think at least some of these get rejected > outright) > > 0016 - not within my knowledge base > >I reviewed the Patch and found a few changes. Please have a look at them: -v7-0002-Change-section-heading-to-better-describe-referen.patch
"Re-Using the Type of Columns and Variables" seems adequate. Getting something in there about declartions seems too wordy. I thought perhaps "Referencing" instead of "Re-Using", but "referencing" isn't perfect and "re-using" is generic enough, shorter, and simpler to Here 'declartions' should be replaced with 'declarations'. -v7-0012-Explain-role-management.patch + The managment of most database objects is by way of granting some role Here 'managment' should be replaced with 'management'. -v7-0013-Hyperlink-from-CREATE-FUNCTION-reference-page-to-.patch Is is nice to have a link in the reference material to a full discussion. Here 'is' should be removed. -v7-0015-Trigger-authors-need-not-worry-about-parallelism.patch Plus, this patch adds an index entry so the new verbage is easy to find for those who do investigate. Here 'verbage' should be replaced with 'verbiage'. -v7-0016-Predicate-locks-are-held-per-cluster-not-per-data.patch This is a significant corner case and so should be documented. It is also somewhat suprising since the databases within a cluster are otherwise isolated, at least from the user's perspective. Here 'suprising' should be replaced with 'surprising'. Predicate locks are held per-cluster, not per database. + This means that serializeable transactions in one database can have + effects in another. + Long running serializeable transactions, as might occur accidentally + when + <link linkend="app-psql-meta-command-pset-pager">pagination</link> + halts <link linkend="app-psql">psql</link> output, can have + significant inter-database effects. + These include exhausting available predicate locks and + cluster-wide <link linkend="ports12">WAL checkpoint delay</link>. + When making use of serializeable transactions consider having + separate clusters for production and non-production use. Here 'serializeable' should be replaced with 'serializable'. Thanks and Regards, Shubham Khanna.