Re: pgbench - add \if support
От | Fabien COELHO |
---|---|
Тема | Re: pgbench - add \if support |
Дата | |
Msg-id | alpine.DEB.2.20.1712141314150.13653@lancre обсуждение исходный текст |
Ответ на | pgbench - add \if support (Fabien COELHO <coelho@cri.ensmp.fr>) |
Ответы |
Re: pgbench - add \if support
|
Список | 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.
Вложения
В списке pgsql-hackers по дате отправления: