PG-1931 Fix returned vaules from C function
Latest version of extension stll may be installed with previous API verison. So we have to return appropriate data set from C code. This commit fixes bug that was introduced in PGSM version 2.1 when extension created with API version 2.0 crashes on data fetch.pull/569/head
parent
9ea39fcb52
commit
d74e927adb
|
|
@ -2300,7 +2300,7 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
else
|
else
|
||||||
nulls[i++] = true;
|
nulls[i++] = true;
|
||||||
|
|
||||||
/* parentid at column number 9 */
|
/* parentid at column number 11 */
|
||||||
if (tmpkey.parentid != UINT64CONST(0))
|
if (tmpkey.parentid != UINT64CONST(0))
|
||||||
{
|
{
|
||||||
values[i++] = UInt64GetDatum(tmpkey.parentid);
|
values[i++] = UInt64GetDatum(tmpkey.parentid);
|
||||||
|
|
@ -2312,7 +2312,7 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
nulls[i++] = true;
|
nulls[i++] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* application_name at column number 15 */
|
/* application_name at column number 13 */
|
||||||
if (strlen(tmp.info.application_name) > 0)
|
if (strlen(tmp.info.application_name) > 0)
|
||||||
values[i++] = CStringGetTextDatum(tmp.info.application_name);
|
values[i++] = CStringGetTextDatum(tmp.info.application_name);
|
||||||
else
|
else
|
||||||
|
|
@ -2445,8 +2445,11 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
values[i++] = Int64GetDatumFast(tmp.blocks.temp_blks_written);
|
values[i++] = Int64GetDatumFast(tmp.blocks.temp_blks_written);
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.shared_blk_read_time);
|
values[i++] = Float8GetDatumFast(tmp.blocks.shared_blk_read_time);
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.shared_blk_write_time);
|
values[i++] = Float8GetDatumFast(tmp.blocks.shared_blk_write_time);
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.local_blk_read_time);
|
if (api_version >= PGSM_V2_1)
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.local_blk_write_time);
|
{
|
||||||
|
values[i++] = Float8GetDatumFast(tmp.blocks.local_blk_read_time);
|
||||||
|
values[i++] = Float8GetDatumFast(tmp.blocks.local_blk_write_time);
|
||||||
|
}
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.temp_blk_read_time);
|
values[i++] = Float8GetDatumFast(tmp.blocks.temp_blk_read_time);
|
||||||
values[i++] = Float8GetDatumFast(tmp.blocks.temp_blk_write_time);
|
values[i++] = Float8GetDatumFast(tmp.blocks.temp_blk_write_time);
|
||||||
|
|
||||||
|
|
@ -2493,18 +2496,25 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_optimization_time);
|
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_optimization_time);
|
||||||
values[i++] = Int64GetDatumFast(tmp.jitinfo.jit_emission_count);
|
values[i++] = Int64GetDatumFast(tmp.jitinfo.jit_emission_count);
|
||||||
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_emission_time);
|
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_emission_time);
|
||||||
values[i++] = Int64GetDatumFast(tmp.jitinfo.jit_deform_count);
|
if (api_version >= PGSM_V2_1)
|
||||||
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_deform_time);
|
{
|
||||||
|
/* at column number 64 */
|
||||||
|
values[i++] = Int64GetDatumFast(tmp.jitinfo.jit_deform_count);
|
||||||
|
values[i++] = Float8GetDatumFast(tmp.jitinfo.jit_deform_time);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at column number 64 */
|
if (api_version >= PGSM_V2_1)
|
||||||
values[i++] = TimestampTzGetDatum(entry->stats_since);
|
{
|
||||||
values[i++] = TimestampTzGetDatum(entry->minmax_stats_since);
|
/* at column number 66 */
|
||||||
|
values[i++] = TimestampTzGetDatum(entry->stats_since);
|
||||||
|
values[i++] = TimestampTzGetDatum(entry->minmax_stats_since);
|
||||||
|
}
|
||||||
|
|
||||||
/* toplevel at column number 66 */
|
/* toplevel at column number 68 */
|
||||||
values[i++] = BoolGetDatum(toplevel);
|
values[i++] = BoolGetDatum(toplevel);
|
||||||
|
|
||||||
/* bucket_done at column number 67 */
|
/* bucket_done at column number 69 */
|
||||||
values[i++] = BoolGetDatum(pg_atomic_read_u64(&pgsm->current_wbucket) != bucketid);
|
values[i++] = BoolGetDatum(pg_atomic_read_u64(&pgsm->current_wbucket) != bucketid);
|
||||||
|
|
||||||
/* clean up and return the tuplestore */
|
/* clean up and return the tuplestore */
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use File::Basename;
|
||||||
|
use File::Compare;
|
||||||
|
use Test::More;
|
||||||
|
use lib 't';
|
||||||
|
use pgsm;
|
||||||
|
|
||||||
|
# Get filename and create out file name and dirs where requried
|
||||||
|
PGSM::setup_files_dir(basename($0));
|
||||||
|
|
||||||
|
# Create new PostgreSQL node and do initdb
|
||||||
|
my $node = PGSM->pgsm_init_pg();
|
||||||
|
my $pgdata = $node->data_dir;
|
||||||
|
|
||||||
|
# Update postgresql.conf to include/load pg_stat_monitor library
|
||||||
|
$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_stat_monitor'");
|
||||||
|
|
||||||
|
# Start server
|
||||||
|
my $rt_value = $node->start;
|
||||||
|
ok($rt_value == 1, "Start Server");
|
||||||
|
|
||||||
|
# Create EXTENSION version 2.0
|
||||||
|
my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor VERSION "2.0";', extra_params => ['-a']);
|
||||||
|
ok($cmdret == 0, "Create PGSM EXTENSION");
|
||||||
|
PGSM::append_to_debug_file($stdout);
|
||||||
|
|
||||||
|
# Check that we have some results for version 2.0
|
||||||
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT * FROM pg_stat_monitor;", extra_params => ['-a']);
|
||||||
|
ok($cmdret == 0, "Check PGSM returns some results for version 2.0");
|
||||||
|
PGSM::append_to_debug_file($stdout);
|
||||||
|
|
||||||
|
# Update EXTENSION to new version 2.1
|
||||||
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', 'ALTER EXTENSION pg_stat_monitor UPDATE TO "2.1";', extra_params => ['-a']);
|
||||||
|
ok($cmdret == 0, "Update PGSM EXTENSION to new version");
|
||||||
|
PGSM::append_to_debug_file($stdout);
|
||||||
|
|
||||||
|
# Check that we have some results for version 2.1
|
||||||
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT * FROM pg_stat_monitor;", extra_params => ['-a']);
|
||||||
|
ok($cmdret == 0, "Check PGSM returns some results for version 2.1");
|
||||||
|
PGSM::append_to_debug_file($stdout);
|
||||||
|
|
||||||
|
# DROP EXTENSION
|
||||||
|
$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']);
|
||||||
|
ok($cmdret == 0, "DROP PGSM EXTENSION");
|
||||||
|
PGSM::append_to_debug_file($stdout);
|
||||||
|
|
||||||
|
# Stop the server
|
||||||
|
$node->stop;
|
||||||
|
|
||||||
|
# Done testing for this testcase file.
|
||||||
|
done_testing();
|
||||||
Loading…
Reference in New Issue