|
8 | 8 | use PostgreSQL::Test::Utils;
|
9 | 9 | use Test::More;
|
10 | 10 |
|
| 11 | +# Runs the specified query and returns the emitted server log. |
| 12 | +# If any parameters are specified, these are set in postgresql.conf, |
| 13 | +# and reset after the query is run. |
| 14 | +sub query_log |
| 15 | +{ |
| 16 | + my ($node, $sql, $params) = @_; |
| 17 | + $params ||= {}; |
| 18 | + |
| 19 | + if (keys %$params) |
| 20 | + { |
| 21 | + for my $key (keys %$params) |
| 22 | + { |
| 23 | + $node->append_conf('postgresql.conf', "$key = $params->{$key}\n"); |
| 24 | + } |
| 25 | + $node->reload; |
| 26 | + } |
| 27 | + |
| 28 | + my $log = $node->logfile(); |
| 29 | + my $offset = -s $log; |
| 30 | + |
| 31 | + $node->safe_psql("postgres", $sql); |
| 32 | + |
| 33 | + my $log_contents = slurp_file($log, $offset); |
| 34 | + |
| 35 | + if (keys %$params) |
| 36 | + { |
| 37 | + for my $key (keys %$params) |
| 38 | + { |
| 39 | + $node->adjust_conf('postgresql.conf', $key, undef); |
| 40 | + } |
| 41 | + $node->reload; |
| 42 | + } |
| 43 | + |
| 44 | + return $log_contents; |
| 45 | +} |
| 46 | + |
11 | 47 | my $node = PostgreSQL::Test::Cluster->new('main');
|
12 | 48 | $node->init;
|
13 | 49 | $node->append_conf('postgresql.conf',
|
|
16 | 52 | $node->append_conf('postgresql.conf', "auto_explain.log_analyze = on");
|
17 | 53 | $node->start;
|
18 | 54 |
|
19 |
| -# run a couple of queries |
20 |
| -$node->safe_psql("postgres", "SELECT * FROM pg_class;"); |
21 |
| -$node->safe_psql("postgres", |
22 |
| - "SELECT * FROM pg_proc WHERE proname = 'int4pl';"); |
23 |
| - |
24 |
| -# emit some json too |
25 |
| -$node->append_conf('postgresql.conf', "auto_explain.log_format = json"); |
26 |
| -$node->reload; |
27 |
| -$node->safe_psql("postgres", "SELECT * FROM pg_proc;"); |
28 |
| -$node->safe_psql("postgres", |
29 |
| - "SELECT * FROM pg_class WHERE relname = 'pg_class';"); |
30 |
| - |
31 |
| -$node->stop('fast'); |
| 55 | +# Simple query. |
| 56 | +my $log_contents = query_log($node, "SELECT * FROM pg_class;"); |
32 | 57 |
|
33 |
| -my $log = $node->logfile(); |
34 |
| - |
35 |
| -my $log_contents = slurp_file($log); |
| 58 | +like( |
| 59 | + $log_contents, |
| 60 | + qr/Query Text: SELECT \* FROM pg_class;/, |
| 61 | + "query text logged, text mode"); |
36 | 62 |
|
37 | 63 | like(
|
38 | 64 | $log_contents,
|
39 | 65 | qr/Seq Scan on pg_class/,
|
40 | 66 | "sequential scan logged, text mode");
|
41 | 67 |
|
| 68 | +# Prepared query. |
| 69 | +$log_contents = query_log($node, |
| 70 | + q{PREPARE get_proc(name) AS SELECT * FROM pg_proc WHERE proname = $1; EXECUTE get_proc('int4pl');} |
| 71 | +); |
| 72 | + |
| 73 | +like( |
| 74 | + $log_contents, |
| 75 | + qr/Query Text: PREPARE get_proc\(name\) AS SELECT \* FROM pg_proc WHERE proname = \$1;/, |
| 76 | + "prepared query text logged, text mode"); |
| 77 | + |
42 | 78 | like(
|
43 | 79 | $log_contents,
|
44 | 80 | qr/Index Scan using pg_proc_proname_args_nsp_index on pg_proc/,
|
45 | 81 | "index scan logged, text mode");
|
46 | 82 |
|
| 83 | +# JSON format. |
| 84 | +$log_contents = query_log( |
| 85 | + $node, |
| 86 | + "SELECT * FROM pg_proc;", |
| 87 | + { "auto_explain.log_format" => "json" }); |
| 88 | + |
| 89 | +like( |
| 90 | + $log_contents, |
| 91 | + qr/"Query Text": "SELECT \* FROM pg_proc;"/, |
| 92 | + "query text logged, json mode"); |
| 93 | + |
47 | 94 | like(
|
48 | 95 | $log_contents,
|
49 | 96 | qr/"Node Type": "Seq Scan"[^}]*"Relation Name": "pg_proc"/s,
|
50 | 97 | "sequential scan logged, json mode");
|
51 | 98 |
|
| 99 | +# Prepared query in JSON format. |
| 100 | +$log_contents = query_log( |
| 101 | + $node, |
| 102 | + q{PREPARE get_class(name) AS SELECT * FROM pg_class WHERE relname = $1; EXECUTE get_class('pg_class');}, |
| 103 | + { "auto_explain.log_format" => "json" }); |
| 104 | + |
| 105 | +like( |
| 106 | + $log_contents, |
| 107 | + qr/"Query Text": "PREPARE get_class\(name\) AS SELECT \* FROM pg_class WHERE relname = \$1;"/, |
| 108 | + "prepared query text logged, json mode"); |
| 109 | + |
52 | 110 | like(
|
53 | 111 | $log_contents,
|
54 | 112 | qr/"Node Type": "Index Scan"[^}]*"Index Name": "pg_class_relname_nsp_index"/s,
|
|
0 commit comments