|
|
@ -542,14 +542,17 @@ pgbench( |
|
|
|
pgbench( |
|
|
|
pgbench( |
|
|
|
'-t 1', 0, |
|
|
|
'-t 1', 0, |
|
|
|
[ qr{type: .*/001_pgbench_gset}, qr{processed: 1/1} ], |
|
|
|
[ qr{type: .*/001_pgbench_gset}, qr{processed: 1/1} ], |
|
|
|
[ qr{command=3.: int 0\b}, |
|
|
|
[ |
|
|
|
|
|
|
|
qr{command=3.: int 0\b}, |
|
|
|
qr{command=5.: int 1\b}, |
|
|
|
qr{command=5.: int 1\b}, |
|
|
|
qr{command=6.: int 2\b}, |
|
|
|
qr{command=6.: int 2\b}, |
|
|
|
qr{command=8.: int 3\b}, |
|
|
|
qr{command=8.: int 3\b}, |
|
|
|
qr{command=10.: int 4\b}, |
|
|
|
qr{command=10.: int 4\b}, |
|
|
|
qr{command=12.: int 5\b} ], |
|
|
|
qr{command=12.: int 5\b} |
|
|
|
|
|
|
|
], |
|
|
|
'pgbench gset command', |
|
|
|
'pgbench gset command', |
|
|
|
{ '001_pgbench_gset' => q{-- test gset |
|
|
|
{ |
|
|
|
|
|
|
|
'001_pgbench_gset' => q{-- test gset |
|
|
|
-- no columns |
|
|
|
-- no columns |
|
|
|
SELECT \gset |
|
|
|
SELECT \gset |
|
|
|
-- one value |
|
|
|
-- one value |
|
|
@ -568,7 +571,8 @@ SELECT 0 AS i4, 4 AS i4 \gset |
|
|
|
-- work on the last SQL command under \; |
|
|
|
-- work on the last SQL command under \; |
|
|
|
\; \; SELECT 0 AS i5 \; SELECT 5 AS i5 \; \; \gset |
|
|
|
\; \; SELECT 0 AS i5 \; SELECT 5 AS i5 \; \; \gset |
|
|
|
\set i debug(:i5) |
|
|
|
\set i debug(:i5) |
|
|
|
} }); |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
# trigger many expression errors |
|
|
|
# trigger many expression errors |
|
|
|
my @errors = ( |
|
|
|
my @errors = ( |
|
|
@ -587,7 +591,8 @@ my @errors = ( |
|
|
|
} |
|
|
|
} |
|
|
|
], |
|
|
|
], |
|
|
|
[ |
|
|
|
[ |
|
|
|
'sql too many args', 1, [qr{statement has too many arguments.*\b255\b}], |
|
|
|
'sql too many args', 1, |
|
|
|
|
|
|
|
[qr{statement has too many arguments.*\b255\b}], |
|
|
|
q{-- MAX_ARGS=256 for prepared |
|
|
|
q{-- MAX_ARGS=256 for prepared |
|
|
|
\set i 0 |
|
|
|
\set i 0 |
|
|
|
SELECT LEAST(} . join(', ', (':i') x 256) . q{)} |
|
|
|
SELECT LEAST(} . join(', ', (':i') x 256) . q{)} |
|
|
@ -625,11 +630,9 @@ SELECT LEAST(}.join(', ', (':i') x 256).q{)} |
|
|
|
'set invalid variable name', 2, |
|
|
|
'set invalid variable name', 2, |
|
|
|
[qr{invalid variable name}], q{\set . 1} |
|
|
|
[qr{invalid variable name}], q{\set . 1} |
|
|
|
], |
|
|
|
], |
|
|
|
|
|
|
|
[ 'set division by zero', 2, [qr{division by zero}], q{\set i 1/0} ], |
|
|
|
[ |
|
|
|
[ |
|
|
|
'set division by zero', 2, |
|
|
|
'set undefined variable', |
|
|
|
[qr{division by zero}], q{\set i 1/0} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
[ 'set undefined variable', |
|
|
|
|
|
|
|
2, |
|
|
|
2, |
|
|
|
[qr{undefined variable "nosuchvariable"}], |
|
|
|
[qr{undefined variable "nosuchvariable"}], |
|
|
|
q{\set i :nosuchvariable} |
|
|
|
q{\set i :nosuchvariable} |
|
|
@ -646,10 +649,8 @@ SELECT LEAST(}.join(', ', (':i') x 256).q{)} |
|
|
|
[qr{empty range given to random}], q{\set i random(5,3)} |
|
|
|
[qr{empty range given to random}], q{\set i random(5,3)} |
|
|
|
], |
|
|
|
], |
|
|
|
[ |
|
|
|
[ |
|
|
|
'set random range too large', |
|
|
|
'set random range too large', 2, |
|
|
|
2, |
|
|
|
[qr{random range is too large}], q{\set i random(:minint, :maxint)} |
|
|
|
[qr{random range is too large}], |
|
|
|
|
|
|
|
q{\set i random(:minint, :maxint)} |
|
|
|
|
|
|
|
], |
|
|
|
], |
|
|
|
[ |
|
|
|
[ |
|
|
|
'set gaussian param too small', |
|
|
|
'set gaussian param too small', |
|
|
@ -713,16 +714,26 @@ SELECT LEAST(}.join(', ', (':i') x 256).q{)} |
|
|
|
], |
|
|
|
], |
|
|
|
|
|
|
|
|
|
|
|
# SET: ARITHMETIC OVERFLOW DETECTION |
|
|
|
# SET: ARITHMETIC OVERFLOW DETECTION |
|
|
|
[ 'set double to int overflow', 2, |
|
|
|
[ |
|
|
|
[ qr{double to int overflow for 100} ], q{\set i int(1E32)} ], |
|
|
|
'set double to int overflow', 2, |
|
|
|
[ 'set bigint add overflow', 2, |
|
|
|
[qr{double to int overflow for 100}], q{\set i int(1E32)} |
|
|
|
[ qr{int add out} ], q{\set i (1<<62) + (1<<62)} ], |
|
|
|
], |
|
|
|
[ 'set bigint sub overflow', 2, |
|
|
|
[ |
|
|
|
[ qr{int sub out} ], q{\set i 0 - (1<<62) - (1<<62) - (1<<62)} ], |
|
|
|
'set bigint add overflow', 2, |
|
|
|
[ 'set bigint mul overflow', 2, |
|
|
|
[qr{int add out}], q{\set i (1<<62) + (1<<62)} |
|
|
|
[ qr{int mul out} ], q{\set i 2 * (1<<62)} ], |
|
|
|
], |
|
|
|
[ 'set bigint div out of range', 2, |
|
|
|
[ |
|
|
|
[ qr{bigint div out of range} ], q{\set i :minint / -1} ], |
|
|
|
'set bigint sub overflow', |
|
|
|
|
|
|
|
2, [qr{int sub out}], q{\set i 0 - (1<<62) - (1<<62) - (1<<62)} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'set bigint mul overflow', 2, |
|
|
|
|
|
|
|
[qr{int mul out}], q{\set i 2 * (1<<62)} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'set bigint div out of range', 2, |
|
|
|
|
|
|
|
[qr{bigint div out of range}], q{\set i :minint / -1} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
|
|
|
|
# SETSHELL |
|
|
|
# SETSHELL |
|
|
|
[ |
|
|
|
[ |
|
|
@ -759,31 +770,47 @@ SELECT LEAST(}.join(', ', (':i') x 256).q{)} |
|
|
|
[qr{invalid command .* "nosuchcommand"}], q{\nosuchcommand} |
|
|
|
[qr{invalid command .* "nosuchcommand"}], q{\nosuchcommand} |
|
|
|
], |
|
|
|
], |
|
|
|
[ 'misc empty script', 1, [qr{empty command list for script}], q{} ], |
|
|
|
[ 'misc empty script', 1, [qr{empty command list for script}], q{} ], |
|
|
|
[ 'bad boolean', 2, |
|
|
|
[ |
|
|
|
[qr{malformed variable.*trueXXX}], q{\set b :badtrue or true} ], |
|
|
|
'bad boolean', 2, |
|
|
|
|
|
|
|
[qr{malformed variable.*trueXXX}], q{\set b :badtrue or true} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
|
|
|
|
# GSET |
|
|
|
# GSET |
|
|
|
[ 'gset no row', 2, |
|
|
|
[ |
|
|
|
[qr{expected one row, got 0\b}], q{SELECT WHERE FALSE \gset} ], |
|
|
|
'gset no row', 2, |
|
|
|
|
|
|
|
[qr{expected one row, got 0\b}], q{SELECT WHERE FALSE \gset} |
|
|
|
|
|
|
|
], |
|
|
|
[ 'gset alone', 1, [qr{gset must follow a SQL command}], q{\gset} ], |
|
|
|
[ 'gset alone', 1, [qr{gset must follow a SQL command}], q{\gset} ], |
|
|
|
[ 'gset no SQL', 1, |
|
|
|
[ |
|
|
|
|
|
|
|
'gset no SQL', 1, |
|
|
|
[qr{gset must follow a SQL command}], q{\set i +1 |
|
|
|
[qr{gset must follow a SQL command}], q{\set i +1 |
|
|
|
\gset} ], |
|
|
|
\gset} |
|
|
|
[ 'gset too many arguments', 1, |
|
|
|
], |
|
|
|
[qr{too many arguments}], q{SELECT 1 \gset a b} ], |
|
|
|
[ |
|
|
|
[ 'gset after gset', 1, |
|
|
|
'gset too many arguments', 1, |
|
|
|
|
|
|
|
[qr{too many arguments}], q{SELECT 1 \gset a b} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'gset after gset', 1, |
|
|
|
[qr{gset must follow a SQL command}], q{SELECT 1 AS i \gset |
|
|
|
[qr{gset must follow a SQL command}], q{SELECT 1 AS i \gset |
|
|
|
\gset} ], |
|
|
|
\gset} |
|
|
|
[ 'gset non SELECT', 2, |
|
|
|
], |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'gset non SELECT', |
|
|
|
|
|
|
|
2, |
|
|
|
[qr{expected one row, got 0}], |
|
|
|
[qr{expected one row, got 0}], |
|
|
|
q{DROP TABLE IF EXISTS no_such_table \gset} ], |
|
|
|
q{DROP TABLE IF EXISTS no_such_table \gset} |
|
|
|
[ 'gset bad default name', 2, |
|
|
|
], |
|
|
|
[qr{error storing into variable \?column\?}], |
|
|
|
[ |
|
|
|
q{SELECT 1 \gset} ], |
|
|
|
'gset bad default name', 2, |
|
|
|
[ 'gset bad name', 2, |
|
|
|
[qr{error storing into variable \?column\?}], q{SELECT 1 \gset} |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'gset bad name', |
|
|
|
|
|
|
|
2, |
|
|
|
[qr{error storing into variable bad name!}], |
|
|
|
[qr{error storing into variable bad name!}], |
|
|
|
q{SELECT 1 AS "bad name!" \gset} ], |
|
|
|
q{SELECT 1 AS "bad name!" \gset} |
|
|
|
); |
|
|
|
],); |
|
|
|
|
|
|
|
|
|
|
|
for my $e (@errors) |
|
|
|
for my $e (@errors) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -792,9 +819,9 @@ for my $e (@errors) |
|
|
|
my $n = '001_pgbench_error_' . $name; |
|
|
|
my $n = '001_pgbench_error_' . $name; |
|
|
|
$n =~ s/ /_/g; |
|
|
|
$n =~ s/ /_/g; |
|
|
|
pgbench( |
|
|
|
pgbench( |
|
|
|
'-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX' . |
|
|
|
'-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX' |
|
|
|
' -Dmaxint=9223372036854775807 -Dminint=-9223372036854775808' . |
|
|
|
. ' -Dmaxint=9223372036854775807 -Dminint=-9223372036854775808' |
|
|
|
($no_prepare ? '' : ' -M prepared'), |
|
|
|
. ($no_prepare ? '' : ' -M prepared'), |
|
|
|
$status, |
|
|
|
$status, |
|
|
|
[ $status == 1 ? qr{^$} : qr{processed: 0/1} ], |
|
|
|
[ $status == 1 ? qr{^$} : qr{processed: 0/1} ], |
|
|
|
$re, |
|
|
|
$re, |
|
|
@ -869,12 +896,9 @@ my $bdir = $node->basedir; |
|
|
|
|
|
|
|
|
|
|
|
# with sampling rate |
|
|
|
# with sampling rate |
|
|
|
pgbench( |
|
|
|
pgbench( |
|
|
|
"-n -S -t 50 -c 2 --log --sampling-rate=0.5", |
|
|
|
"-n -S -t 50 -c 2 --log --sampling-rate=0.5", 0, |
|
|
|
0, |
|
|
|
[ qr{select only}, qr{processed: 100/100} ], [qr{^$}], |
|
|
|
[ qr{select only}, qr{processed: 100/100} ], |
|
|
|
'pgbench logs', undef, |
|
|
|
[ qr{^$} ], |
|
|
|
|
|
|
|
'pgbench logs', |
|
|
|
|
|
|
|
undef, |
|
|
|
|
|
|
|
"--log-prefix=$bdir/001_pgbench_log_2"); |
|
|
|
"--log-prefix=$bdir/001_pgbench_log_2"); |
|
|
|
|
|
|
|
|
|
|
|
check_pgbench_logs($bdir, '001_pgbench_log_2', 1, 8, 92, |
|
|
|
check_pgbench_logs($bdir, '001_pgbench_log_2', 1, 8, 92, |
|
|
@ -882,8 +906,8 @@ check_pgbench_logs($bdir, '001_pgbench_log_2', 1, 8, 92, |
|
|
|
|
|
|
|
|
|
|
|
# check log file in some detail |
|
|
|
# check log file in some detail |
|
|
|
pgbench( |
|
|
|
pgbench( |
|
|
|
"-n -b se -t 10 -l", |
|
|
|
"-n -b se -t 10 -l", 0, |
|
|
|
0, [ qr{select only}, qr{processed: 10/10} ], [ qr{^$} ], |
|
|
|
[ qr{select only}, qr{processed: 10/10} ], [qr{^$}], |
|
|
|
'pgbench logs contents', undef, |
|
|
|
'pgbench logs contents', undef, |
|
|
|
"--log-prefix=$bdir/001_pgbench_log_3"); |
|
|
|
"--log-prefix=$bdir/001_pgbench_log_3"); |
|
|
|
|
|
|
|
|
|
|
|