Re: proposal: schema variables

Pavel Stehule <pavel.stehule@gmail.com>

From: Pavel Stehule <pavel.stehule@gmail.com>
To: Laurenz Albe <laurenz.albe@cybertec.at>
Cc: Erik Rijkers <er@xs4all.nl>, Michael Paquier <michael@paquier.xyz>, Amit Kapila <amit.kapila16@gmail.com>, DUVAL REMI <REMI.DUVAL@cheops.fr>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2024-07-31T06:41:50Z
Lists: pgsql-hackers, pgsql-performance

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Move WAL sequence code into its own file

  2. Add ExplainState argument to pg_plan_query() and planner().

  3. Don't include access/htup_details.h in executor/tuptable.h

  4. Refactor to avoid code duplication in transformPLAssignStmt.

  5. Avoid including commands/dbcommands.h in so many places

  6. Restrict psql meta-commands in plain-text dumps.

  7. Split func.sgml into more manageable pieces

  8. Fix squashing algorithm for query texts

  9. EXPLAIN: Always use two fractional digits for row counts.

  10. Preliminary refactoring of plpgsql expression construction.

  11. plpgsql: pure parser and reentrant scanner

  12. Add some sanity checks in executor for query ID reporting

  13. Fix misleading error message context

  14. Add macros for looping through a List without a ListCell.

út 30. 7. 2024 v 21:46 odesílatel Laurenz Albe <laurenz.albe@cybertec.at>
napsal:

> This is my review of the second patch in the series.
>
> Again, I mostly changed code comments and documentation.
>
> Noteworthy remarks:
>
> - A general reminder: single line comments should start with a lower case
>   letter and have to period in the end:
>
>   /* this is a typical single line comment */
>
> - Variable as parameter:
>
>   CREATE VARIABLE var AS date;
>   LET var = current_date;
>   PREPARE stmt(date) AS SELECT $1;
>   EXECUTE stmt(var);
>   ERROR:  paramid of PARAM_VARIABLE param is out of range
>
>   Is that working as intended?  I don't understand the error message.
>
>   Perhaps there is a bug in src/backend/executor/execExpr.c.
>
> - IdentifyVariable
>
>   > --- a/src/backend/catalog/namespace.c
>   > +++ b/src/backend/catalog/namespace.c
>   > [...]
>   > +/*
>   > + * IdentifyVariable - try to find variable identified by list of
> names.
>   > [...]
>
>   The function comment doesn't make clear to me what the function does.
>   Perhaps that is so confusing because the function seems to serve several
>   purposes (during parsing, in ANALYZE, and to identify shadowed variables
>   in a later patch).
>
>   I rewrote the function comment, but didn't touch the code or code
> comments.
>
>   Perhaps part of the reason why this function is so complicated is that
>   you support things like this:
>
>     CREATE SCHEMA sch;
>     CREATE TYPE cp AS (a integer, b integer);
>     CREATE VARIABLE sch.v AS cp;
>     LET sch.v = (1, 2);
>     SELECT sch.v.b;
>      b
>     ═══
>      2
>     (1 row)
>
>     test=# SELECT test.sch.v.b;
>      b
>     ═══
>      2
>     (1 row)
>
>   We don't support that for tables:
>
>     CREATE TABLE tab (c cp);
>     INSERT INTO tab VALUES (ROW(42, 43));
>     SELECT tab.c.b FROM tab;
>     ERROR:  cross-database references are not implemented: tab.c.b
>
>   You have to use extra parentheses:
>
>     SELECT (tab.c).b FROM tab;
>      b
>     ════
>      43
>     (1 row)
>
>   I'd say that this should be the same for session variables.
>   What do you think?
>
>   Code comments:
>
>   - There are lots of variables declared at the beginning, but they are
> only
>     used in code blocks further down.  For clarity, you should declare a
>     variable in the code block where it is used.
>
>   - +                   /*
>     +                    * In this case, "a" is used as catalog name -
> check it.
>     +                    */
>     +                   if (strcmp(a, get_database_name(MyDatabaseId)) !=
> 0)
>     +                   {
>     +                       if (!noerror)
>     +                           ereport(ERROR,
>     +
>  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
>     +                                    errmsg("cross-database references
> are not implemented: %s",
>     +                                           NameListToString(names))));
>     +                   }
>     +                   else
>     +                   {
>
>     There needn't be an "else", since the ereport() will never return.
>     Less indentation is better.
>
> - src/backend/commands/session_variable.c
>
>   There is one comment that confuses me and that I did not edit:
>
>   > +Datum
>   > +GetSessionVariable(Oid varid, bool *isNull, Oid *typid)
>   > +{
>   > +   SVariable   svar;
>   > +
>   > +   svar = get_session_variable(varid);
>   > +
>   > +   /*
>   > +    * Although svar is freshly validated in this point, the
> svar->is_valid can
>   > +    * be false, due possible accepting invalidation message inside
> domain
>   > +    * check. Now, the validation is done after lock, that can also
> accept
>   > +    * invalidation message, so validation should be trustful.
>   > +    *
>   > +    * For now, we don't need to repeat validation. Only svar should
> be valid
>   > +    * pointer.
>   > +    */
>   > +   Assert(svar);
>   > +
>   > +   *typid = svar->typid;
>   > +
>   > +   return copy_session_variable_value(svar, isNull);
>   > +}
>
> - src/backend/executor/execMain.c
>
>   > @@ -196,6 +198,51 @@ standard_ExecutorStart(QueryDesc *queryDesc, int
> eflags)
>   >     Assert(queryDesc->sourceText != NULL);
>   >     estate->es_sourceText = queryDesc->sourceText;
>   >
>   > +   /*
>   > +    * The executor doesn't work with session variables directly.
> Values of
>   > +    * related session variables are copied to dedicated array, and
> this array
>   > +    * is passed to executor.
>   > +    */
>
>   Why?  Is that a performance measure?  The comment should explain that.
>
> - parallel safety
>
>   > --- a/src/backend/optimizer/util/clauses.c
>   > +++ b/src/backend/optimizer/util/clauses.c
>   > @@ -935,6 +936,13 @@ max_parallel_hazard_walker(Node *node,
> max_parallel_hazard_context *context)
>   >         if (param->paramkind == PARAM_EXTERN)
>   >             return false;
>   >
>   > +       /* We doesn't support passing session variables to workers */
>   > +       if (param->paramkind == PARAM_VARIABLE)
>   > +       {
>   > +           if (max_parallel_hazard_test(PROPARALLEL_RESTRICTED,
> context))
>   > +               return true;
>   > +       }
>
>   Even if a later patch alleviates that restriction, this patch should
> document that
>   session variables imply "parallel restricted".  I have added that to
> doc/src/sgml/parallel.sgml.
>
> Attached are the first two patches with my edits (the first patch is
> unchanged;
> I just add it again to keep the cfbot happy.
>

Probably you didn't attach new files - the second patch is not complete. Or
you didn't make changes there?

Regards

Pavel



>
> I hope to get to review the other patches at some later time.
>
> Yours,
> Laurenz Albe
>