@@ -160,8 +160,8 @@ typedef struct socket_set
160
160
/********************************************************************
161
161
* some configurable parameters */
162
162
163
- #define DEFAULT_INIT_STEPS "dtgvp " /* default -I setting */
164
- #define ALL_INIT_STEPS "dtgGvpf " /* all possible steps */
163
+ #define DEFAULT_INIT_STEPS "dYtgvpy " /* default -I setting */
164
+ #define ALL_INIT_STEPS "dYtgGvpfy " /* all possible steps */
165
165
166
166
#define LOG_STEP_SECONDS 5 /* seconds between log messages */
167
167
#define DEFAULT_NXACTS 10 /* default nxacts */
@@ -796,6 +796,33 @@ static const BuiltinScript builtin_script[] =
796
796
"INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
797
797
"END;\n"
798
798
},
799
+ {
800
+ "plpgsql-tpcb-like" ,
801
+ "<builtin: TPC-B (sort of) - pl/pgsql UDF>" ,
802
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
803
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
804
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
805
+ "\\set delta random(-5000, 5000)\n"
806
+ "SELECT 1 FROM pgbench_tpcb_like(:aid, :bid, :tid, :delta);\n"
807
+ },
808
+ {
809
+ "sqlfunc-tpcb-like" ,
810
+ "<builtin: TPC-B (sort of) - 'BEGIN ATOMIC' SQL UDF>" ,
811
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
812
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
813
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
814
+ "\\set delta random(-5000, 5000)\n"
815
+ "SELECT 1 FROM pgbench_tpcb_like_sqlfunc(:aid, :bid, :tid, :delta);\n"
816
+ },
817
+ {
818
+ "oldsqlf-tpcb-like" ,
819
+ "<builtin: TPC-B (sort of) - LANGUAGE SQL UDF>" ,
820
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
821
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
822
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
823
+ "\\set delta random(-5000, 5000)\n"
824
+ "SELECT 1 FROM pgbench_tpcb_like_oldsqlfunc(:aid, :bid, :tid, :delta);\n"
825
+ },
799
826
{
800
827
"simple-update" ,
801
828
"<builtin: simple update>" ,
@@ -809,6 +836,33 @@ static const BuiltinScript builtin_script[] =
809
836
"INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
810
837
"END;\n"
811
838
},
839
+ {
840
+ "plpgsql-simple-update" ,
841
+ "<builtin: simple update - pl/pgsql UDF>" ,
842
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
843
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
844
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
845
+ "\\set delta random(-5000, 5000)\n"
846
+ "SELECT 1 FROM pgbench_simple_update(:aid, :bid, :tid, :delta);\n"
847
+ },
848
+ {
849
+ "sqlfunc-simple-update" ,
850
+ "<builtin: simple update - 'BEGIN ATOMIC' SQL UDF>" ,
851
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
852
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
853
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
854
+ "\\set delta random(-5000, 5000)\n"
855
+ "SELECT 1 FROM pgbench_simple_update_sqlfunc(:aid, :bid, :tid, :delta);\n"
856
+ },
857
+ {
858
+ "oldsqlf-simple-update" ,
859
+ "<builtin: simple update - LANGUAGE SQL UDF>" ,
860
+ "\\set aid random(1, " CppAsString2 (naccounts ) " * :scale)\n"
861
+ "\\set bid random(1, " CppAsString2 (nbranches ) " * :scale)\n"
862
+ "\\set tid random(1, " CppAsString2 (ntellers ) " * :scale)\n"
863
+ "\\set delta random(-5000, 5000)\n"
864
+ "SELECT 1 FROM pgbench_simple_update_oldsqlfunc(:aid, :bid, :tid, :delta);\n"
865
+ },
812
866
{
813
867
"select-only" ,
814
868
"<builtin: select only>" ,
@@ -915,6 +969,7 @@ usage(void)
915
969
" -q, --quiet quiet logging (one message each 5 seconds)\n"
916
970
" -s, --scale=NUM scaling factor\n"
917
971
" --foreign-keys create foreign key constraints between tables\n"
972
+ " --no-functions do not create pl/pgsql and SQL functions for internal scripts\n"
918
973
" --index-tablespace=TABLESPACE\n"
919
974
" create indexes in the specified tablespace\n"
920
975
" --partition-method=(range|hash)\n"
@@ -4763,7 +4818,7 @@ initDropTables(PGconn *con)
4763
4818
"pgbench_accounts, "
4764
4819
"pgbench_branches, "
4765
4820
"pgbench_history, "
4766
- "pgbench_tellers" );
4821
+ "pgbench_tellers cascade " );
4767
4822
}
4768
4823
4769
4824
/*
@@ -4838,6 +4893,107 @@ createPartitions(PGconn *con)
4838
4893
termPQExpBuffer (& query );
4839
4894
}
4840
4895
4896
+ /*
4897
+ * Create the functions needed for plpgsql-* builting scripts
4898
+ */
4899
+ static void
4900
+ initCreateFuntions (PGconn * con )
4901
+ {
4902
+ fprintf (stderr , "creating functions...\n" );
4903
+
4904
+ executeStatement (con ,
4905
+ "CREATE FUNCTION pgbench_tpcb_like(_aid int, _bid int, _tid int, _delta int)\n"
4906
+ "RETURNS void\n"
4907
+ "LANGUAGE plpgsql\n"
4908
+ "AS $plpgsql$\n"
4909
+ "BEGIN\n"
4910
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4911
+ " PERFORM abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4912
+ " UPDATE pgbench_tellers SET tbalance = tbalance + _delta WHERE tid = _tid;\n"
4913
+ " UPDATE pgbench_branches SET bbalance = bbalance + _delta WHERE bid = _bid;\n"
4914
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4915
+ "END;\n"
4916
+ "$plpgsql$;\n" );
4917
+ executeStatement (con ,
4918
+ "CREATE FUNCTION pgbench_simple_update(_aid int, _bid int, _tid int, _delta int)\n"
4919
+ "RETURNS void\n"
4920
+ "LANGUAGE plpgsql\n"
4921
+ "AS $plpgsql$\n"
4922
+ "BEGIN\n"
4923
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4924
+ " PERFORM abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4925
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4926
+ "END;\n"
4927
+ "$plpgsql$;\n" );
4928
+ if ((PQserverVersion (con ) >= 140000 ))
4929
+ {
4930
+ executeStatement (con ,
4931
+ "CREATE FUNCTION pgbench_tpcb_like_sqlfunc(_aid int, _bid int, _tid int, _delta int)\n"
4932
+ "RETURNS void\n"
4933
+ "BEGIN ATOMIC\n"
4934
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4935
+ " SELECT abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4936
+ " UPDATE pgbench_tellers SET tbalance = tbalance + _delta WHERE tid = _tid;\n"
4937
+ " UPDATE pgbench_branches SET bbalance = bbalance + _delta WHERE bid = _bid;\n"
4938
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4939
+ "END;\n" );
4940
+ executeStatement (con ,
4941
+ "CREATE FUNCTION pgbench_simple_update_sqlfunc(_aid int, _bid int, _tid int, _delta int)\n"
4942
+ "RETURNS void\n"
4943
+ "BEGIN ATOMIC\n"
4944
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4945
+ " SELECT abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4946
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4947
+ "END;\n" );
4948
+ }
4949
+ executeStatement (con ,
4950
+ "CREATE FUNCTION pgbench_tpcb_like_oldsqlfunc(_aid int, _bid int, _tid int, _delta int)\n"
4951
+ "RETURNS void\n"
4952
+ "LANGUAGE sql\n"
4953
+ "AS $sql$\n"
4954
+ "-- BEGIN\n"
4955
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4956
+ " SELECT abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4957
+ " UPDATE pgbench_tellers SET tbalance = tbalance + _delta WHERE tid = _tid;\n"
4958
+ " UPDATE pgbench_branches SET bbalance = bbalance + _delta WHERE bid = _bid;\n"
4959
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4960
+ "-- END;\n"
4961
+ "$sql$;\n" );
4962
+ executeStatement (con ,
4963
+ "CREATE FUNCTION pgbench_simple_update_oldsqlfunc(_aid int, _bid int, _tid int, _delta int)\n"
4964
+ "RETURNS void\n"
4965
+ "LANGUAGE sql\n"
4966
+ "AS $sql$\n"
4967
+ "-- BEGIN\n"
4968
+ " UPDATE pgbench_accounts SET abalance = abalance + _delta WHERE aid = _aid;\n"
4969
+ " SELECT abalance FROM pgbench_accounts WHERE aid = _aid;\n"
4970
+ " INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (_tid, _bid, _aid, _delta, CURRENT_TIMESTAMP);\n"
4971
+ "-- END;\n"
4972
+ "$sql$;\n" );
4973
+ }
4974
+
4975
+ /*
4976
+ * Remove old pgbench functions, if any exist
4977
+ */
4978
+ static void
4979
+ initDropFunctions (PGconn * con )
4980
+ {
4981
+ fprintf (stderr , "dropping old functions...\n" );
4982
+
4983
+ executeStatement (con ,
4984
+ "DROP FUNCTION IF EXISTS pgbench_tpcb_like(_aid int, _bid int, _tid int, _delta int);\n" );
4985
+ executeStatement (con ,
4986
+ "DROP FUNCTION IF EXISTS pgbench_simple_update(_aid int, _bid int, _tid int, _delta int);\n" );
4987
+ executeStatement (con ,
4988
+ "DROP FUNCTION IF EXISTS pgbench_tpcb_like_sqlfunc(_aid int, _bid int, _tid int, _delta int);\n" );
4989
+ executeStatement (con ,
4990
+ "DROP FUNCTION IF EXISTS pgbench_simple_update_sqlfunc(_aid int, _bid int, _tid int, _delta int);\n" );
4991
+ executeStatement (con ,
4992
+ "DROP FUNCTION IF EXISTS pgbench_tpcb_like_oldsqlfunc(_aid int, _bid int, _tid int, _delta int);\n" );
4993
+ executeStatement (con ,
4994
+ "DROP FUNCTION IF EXISTS pgbench_simple_update_oldsqlfunc(_aid int, _bid int, _tid int, _delta int);\n" );
4995
+ }
4996
+
4841
4997
/*
4842
4998
* Create pgbench's standard tables
4843
4999
*/
@@ -5324,6 +5480,14 @@ runInitSteps(const char *initialize_steps)
5324
5480
op = "foreign keys" ;
5325
5481
initCreateFKeys (con );
5326
5482
break ;
5483
+ case 'Y' :
5484
+ op = "drop functions" ;
5485
+ initDropFunctions (con );
5486
+ break ;
5487
+ case 'y' :
5488
+ op = "create functions" ;
5489
+ initCreateFuntions (con );
5490
+ break ;
5327
5491
case ' ' :
5328
5492
break ; /* ignore */
5329
5493
default :
@@ -6159,7 +6323,7 @@ listAvailableScripts(void)
6159
6323
6160
6324
fprintf (stderr , "Available builtin scripts:\n" );
6161
6325
for (i = 0 ; i < lengthof (builtin_script ); i ++ )
6162
- fprintf (stderr , " %13s : %s\n" , builtin_script [i ].name , builtin_script [i ].desc );
6326
+ fprintf (stderr , " %21s : %s\n" , builtin_script [i ].name , builtin_script [i ].desc );
6163
6327
fprintf (stderr , "\n" );
6164
6328
}
6165
6329
@@ -6718,13 +6882,15 @@ main(int argc, char **argv)
6718
6882
{"verbose-errors" , no_argument , NULL , 15 },
6719
6883
{"exit-on-abort" , no_argument , NULL , 16 },
6720
6884
{"debug" , no_argument , NULL , 17 },
6885
+ {"no-functions" , no_argument , NULL , 18 },
6721
6886
{NULL , 0 , NULL , 0 }
6722
6887
};
6723
6888
6724
6889
int c ;
6725
6890
bool is_init_mode = false; /* initialize mode? */
6726
6891
char * initialize_steps = NULL ;
6727
6892
bool foreign_keys = false;
6893
+ bool no_functions = false;
6728
6894
bool is_no_vacuum = false;
6729
6895
bool do_vacuum_accounts = false; /* vacuum accounts table? */
6730
6896
int optindex ;
@@ -7071,6 +7237,10 @@ main(int argc, char **argv)
7071
7237
case 17 : /* debug */
7072
7238
pg_logging_increase_verbosity ();
7073
7239
break ;
7240
+ case 18 : /* no-functions */
7241
+ initialization_option_set = true;
7242
+ no_functions = true;
7243
+ break ;
7074
7244
default :
7075
7245
/* getopt_long already emitted a complaint */
7076
7246
pg_log_error_hint ("Try \"%s --help\" for more information." , progname );
@@ -7168,6 +7338,15 @@ main(int argc, char **argv)
7168
7338
* p = ' ' ;
7169
7339
}
7170
7340
7341
+ if (no_functions )
7342
+ {
7343
+ /* Remove create function step in initialize_steps */
7344
+ char * p ;
7345
+
7346
+ while ((p = strchr (initialize_steps , 'y' )) != NULL )
7347
+ * p = ' ' ;
7348
+ }
7349
+
7171
7350
if (foreign_keys )
7172
7351
{
7173
7352
/* Add 'f' to end of initialize_steps, if not already there */
0 commit comments