Re: [HACKERS] proposal: session server side variables

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: [HACKERS] proposal: session server side variables
Дата
Msg-id CAFj8pRDGcNVy+FAW7OAJjyZrMxEFHBz-GKVJyJ4+3w3M0NcBfA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [HACKERS] proposal: session server side variables  (Fabien COELHO <coelho@cri.ensmp.fr>)
Ответы Re: [HACKERS] proposal: session server side variables  (Fabien COELHO <coelho@cri.ensmp.fr>)
Список pgsql-hackers


2016-12-24 12:19 GMT+01:00 Fabien COELHO <coelho@cri.ensmp.fr>:

Hello Pavel,

Hmmm. Switching role within a transaction. I never did need that... but
that is a use case.

Any application with security definer functions - depends on different
communities - it is used sometimes strongly.

Hmmm. So I understand that you would like to do something like:

  - call a secure function which sets a session variable with restricted
    permissions
  - do some things which cannot access or change the variable
  - call another secure function which can access, update, remove the
    variable...

Probably we have different expectation from variables. I don't expect so
variable can be changed by any rollback.

Indeed, it seems that we do not have the same expectations.

What is use case for transactional variables? I miss any experience - I
wrote lot plpgsql lines and newer would it.

Here are two use cases, which are neither good nor bad, but that I have in mind when I'm argumenting.

(1) First use case I'm thinking of is software update, with persistent transactional variables, eg:

  -- let assume we have application_version = 1
  BEGIN;
   -- lock things up
   -- update application schema and data to version 2
   -- set application_version = 2
   -- unlock things
  COMMIT;

I would not want the application_version to remain at 2 if the COMMIT fails, obviously. This is usually implemented with a one-row table, but some kind of variable syntax could be quite elegant. For this use case, a variable should be persistant, it does not it to be efficient, it should have permissions and should be transactional.


(2) Second use case I'm thinking of is some kind of large batch management.

  -- variable batch_1_is_done = false
  BEGIN;
    -- try to do large batch 1...
    -- set batch_1_is_done = true
  COMMIT;
  -- then test whether it worked, do some cleanup if not...
  -- there are some discussions to get some \if in psql...

For this second example, I would not like batch_is_done to be true if the commit failed, but I do not think that any permissions would be useful, and it would be fine if it is just accessible from a session only.

On server side you can use PLpgSQL and handling exception.

On client side you can use technique used in MSSQL, where variables are not transactional too.

BEGIN
  -- servar state 1
  statement;
  -- servar state 2
  statement;
COMMIT

We should to introduce client side session variable :STATUS

\if eq(:STATUS, 'ok')
 ...

  


When I remove ACID, and allow only one value - then the implementation can
be simple and fast - some next step can be support of expandable types.
Sure - anybody can use temporary tables now and in future. But it is slow -
more now, because we doesn't support global temporary tables. But ACID
needs lot of CPU times, needs possible VACUUM, ...

Yep, but if you need persistant and transactional then probably you can accept less performant...

When you accept less performance, then you can use temporary tables. You can easy wrap it by few polymorphic functions.


No ACID variables are simple to implement, simple to directly accessible
from any PL (although I am thinking about better support in 2nd phase for
PLpgSQL).

ACID may be simple to implement with some kind of underlying table, or maybe a row in a table. How efficient it could be is another question, but then if the feature does not allow some use cases, and it not so interesting to have it. That is why I think that it is worth discussing "silly" semantics and syntax.

The namespace issue is unclear to me. Would a variable name clash with a table name? It should if you want to be able write "SELECT stuff FROM variablename", which may or may not be a good idea.

It is based on history and experience - one fundamental issue of languages for stored procedures is a conflict of variables and SQL identifiers. When variables are based on pg_class, there are not possibility to any new conflict.

More I can use a security related to schema - It is partial coverage of package variables.

Regards

Pavel




--
Fabien.

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Fabien COELHO
Дата:
Сообщение: Re: [HACKERS] proposal: session server side variables
Следующее
От: Rafia Sabih
Дата:
Сообщение: Re: [HACKERS] Parallel Index-only scan