pgbench - add \if support - Mailing list pgsql-hackers

From Fabien COELHO
Subject pgbench - add \if support
Date
Msg-id alpine.DEB.2.20.1711252200190.28523@lancre
Whole thread Raw
Responses Re: pgbench - add \if support  (Fabien COELHO <coelho@cri.ensmp.fr>)
Re: pgbench - add \if support  (Vik Fearing <vik.fearing@2ndquadrant.com>)
List pgsql-hackers
This patch adds \if support to pgbench, similar to psql's version added 
in March.

This patch brings a consistent set of features especially when combined 
with two other patches already in the (slow) CF process:

  - https://commitfest.postgresql.org/10/596/ .. /15/985/
    adds support for booleans expressions (comparisons, logical
    operators, ...). This enhanced expression engine would be useful
    to allow client-side expression in psql.

  - https://commitfest.postgresql.org/10/669/ .. /15/669/
    adds support for \gset, so that pgbench can interact with a database
    and extract something into a variable, instead of discarding it.

This patch adds a \if construct so that an expression on variables, 
possibly with data coming from the database, can change the behavior of a 
script.

For instance, the following script, which uses features from the three 
patches, would implement TPC-B per spec (not "tpcb-like", but really as 
specified).

   \set tbid  random(1, :scale)
   \set tid  10 * (:tbid - 1) + random(1, 10)
   -- client in same branch as teller at 85%
   \if :scale = 1 OR random(0, 99) < 85
     -- same branch
     \set bid  :tbid
   \else
     -- different branch
     \set bid  1 + (:tbid + random(1, :scale - 1)) % :scale
   \endif
   \set aid  :bid * 100000 + random(1, 100000)
   \set delta  random(-999999, 999999)
   BEGIN;
   UPDATE pgbench_accounts
     SET abalance = abalance + :delta WHERE aid = :aid
     RETURNING abalance AS balance \gset
   UPDATE pgbench_tellers
     SET tbalance = tbalance + :delta WHERE tid = :tid;
   UPDATE pgbench_branches
     SET bbalance = bbalance + :delta WHERE bid = :bid;
   INSERT INTO pgbench_history (tid, bid, aid, delta, mtime)
     VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
   END;

The patch moves the conditional stack infrastructure from psql to 
fe_utils, so that it is available to both psql & pgbench.

A partial evaluation is performed to detect structural errors (eg missing 
endif, else after else...) when the script is parsed, so that such errors 
cannot occur when a script is running.

A new automaton state is added to quickly step over false branches.

TAP tests ensure reasonable coverage of the feature.

-- 
Fabien
Attachment

pgsql-hackers by date:

Previous
From: Mark Dilger
Date:
Subject: Re: [HACKERS] PATCH: multivariate histograms and MCV lists
Next
From: Tom Lane
Date:
Subject: Re: Code cleanup patch submission for extended_stats.c