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

From Fabien COELHO
Subject Re: pgbench - add \if support
Date
Msg-id alpine.DEB.2.20.1712141314150.13653@lancre
Whole thread Raw
In response to pgbench - add \if support  (Fabien COELHO <coelho@cri.ensmp.fr>)
Responses Re: pgbench - add \if support  (Fabien COELHO <coelho@cri.ensmp.fr>)
List pgsql-hackers
Mostly a rebase after zipfian function commit.

> 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: Fabien COELHO
Date:
Subject: Re: [HACKERS] pgbench more operators & functions
Next
From: Ali Akbar
Date:
Subject: Re: [HACKERS] pg_upgrade failed with error - ERROR: column "a" inchild table must be marked NOT NULL