Fabien COELHO wrote: > My 0.02 € about server-side expressions: ISTM that there is nothing > obvious/easy to do to include these: > > - how would it work, both with \set ... and \if ...?
The idea is that the need to have two command (a SELECT .. \gset followed by an \if) and a temporary variable in-between would be lifted by implementing a close equivalent in one command. It would behave essentially the same as the two commands. I don't see that \set must have to be involved in that improvement, although it could be indirectly, depending on what exactly we implement. \set differs in that it already exists in released versions, so we have the backward compatibility to consider. With \if we are not bound by that, but what \if will be at feature freeze needs to be as convenient as we can make it in this release, and not block progress in v11 and later, as these future improvements will have to be backward-compatible against v10. > - should it be just simple expressions or may it allow complex > queries? Let's imagine that psql would support a syntax like this: \if [select current_setting('server_version_num')::int < 110000] or \if [select 1 from pg_catalog.pg_extension where extname='pgcrypto'] where by convention [ and ] enclose an SQL query that's assumed to return a single-row, single-column bool-ish value, and in which psql variables would be expanded, like they are now in backtick expressions. Queries can be as complex as necessary, they just have to fit in one line. > - how would error detection and handling work from a script? The same as SELECT..\gset followed by \if, when the SELECT fails. > - should it have some kind of continuation, as expressions are > likely to be longer than a constant? No, to me that falls into the issue of continuation of backslash commands in general, which is discussed separately. > - how would they interact with possible client-side expressions? In no way at all,in the sense that, either you choose to use an SQL evaluator, or a client-side evaluator (if it exists), or a backtick expression. They are mutually exclusive for a single \if invocation. Client-side evaluation would have to be called with a syntax that is unambiguously different. For example it could be \if (:SQLSTATE = '23505') \echo A record with the unique key :key_id already exists rollback \endif AFAIK we don't have :SQLSTATE yet, but we should :) Maybe the parentheses are not required, or we could require a different set of brackets to enclose an expression to evaluate internally, like {}, or whatever provided it's not ambiguous. > (on this point, I think that client-side is NOT needed for "psql". > It makes sense for "pgbench" in a benchmarking context where the > client must interact with the server in some special meaningful > way, but for simple scripting the performance requirement and > logic is not the same, so server-side could be enough). Client-side evaluation is useful for the example above, where you expect that you might be in a failed transaction, or even not connected, and you need to do quite simple tests. We can do that already with backtick expansion and a shell evaluation command, but it's a bit heavy/inelegant and creates a dependency on external commands that is detrimental to portability. I agree that we don't need a full-featured built-in evaluator, because the cases where it's needed will be rare enough that it's reasonable to have to defer to an external evaluator in those cases. Best regards, -- Daniel Vérité PostgreSQL-powered mailer: http://www.manitou-mail.org Twitter: @DanielVerite -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers