2016-02-04 23:03:10 -05:00
|
|
|
--
|
|
|
|
|
-- num_nulls()
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
SELECT num_nonnulls(NULL);
|
|
|
|
|
SELECT num_nonnulls('1');
|
|
|
|
|
SELECT num_nonnulls(NULL::text);
|
|
|
|
|
SELECT num_nonnulls(NULL::text, NULL::int);
|
|
|
|
|
SELECT num_nonnulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL);
|
|
|
|
|
SELECT num_nonnulls(VARIADIC '{1,2,NULL,3}'::int[]);
|
|
|
|
|
SELECT num_nonnulls(VARIADIC '{"1","2","3","4"}'::text[]);
|
|
|
|
|
SELECT num_nonnulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i));
|
|
|
|
|
|
|
|
|
|
SELECT num_nulls(NULL);
|
|
|
|
|
SELECT num_nulls('1');
|
|
|
|
|
SELECT num_nulls(NULL::text);
|
|
|
|
|
SELECT num_nulls(NULL::text, NULL::int);
|
|
|
|
|
SELECT num_nulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL);
|
|
|
|
|
SELECT num_nulls(VARIADIC '{1,2,NULL,3}'::int[]);
|
|
|
|
|
SELECT num_nulls(VARIADIC '{"1","2","3","4"}'::text[]);
|
|
|
|
|
SELECT num_nulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i));
|
|
|
|
|
|
|
|
|
|
-- special cases
|
|
|
|
|
SELECT num_nonnulls(VARIADIC NULL::text[]);
|
|
|
|
|
SELECT num_nonnulls(VARIADIC '{}'::int[]);
|
|
|
|
|
SELECT num_nulls(VARIADIC NULL::text[]);
|
|
|
|
|
SELECT num_nulls(VARIADIC '{}'::int[]);
|
|
|
|
|
|
|
|
|
|
-- should fail, one or more arguments is required
|
|
|
|
|
SELECT num_nonnulls();
|
|
|
|
|
SELECT num_nulls();
|
2019-02-09 18:32:23 -05:00
|
|
|
|
Make canonicalize_path() more canonical.
Teach canonicalize_path() how to strip all unnecessary uses of "."
and "..", replacing the previous ad-hoc code that got rid of only
some such cases. In particular, we can always remove all such
uses from absolute paths.
The proximate reason to do this is that Windows rejects paths
involving ".." in some cases (in particular, you can't put one in a
symlink), so we ought to be sure we don't use ".." unnecessarily.
Moreover, it seems like good cleanup on general principles.
There is other path-munging code that could be simplified now, but
we'll leave that for followup work.
It is tempting to call this a bug fix and back-patch it. On the other
hand, the misbehavior can only be reached if a highly privileged user
does something dubious, so it's not unreasonable to say "so don't do
that". And this patch could result in unexpected behavioral changes,
in case anybody was expecting uses of ".." to stay put. So at least
for now, just put it in HEAD.
Shenhao Wang, editorialized a bit by me
Discussion: https://postgr.es/m/OSBPR01MB4214FA221FFE046F11F2AD74F2D49@OSBPR01MB4214.jpnprd01.prod.outlook.com
2022-01-31 12:05:37 -05:00
|
|
|
--
|
|
|
|
|
-- canonicalize_path()
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
SELECT test_canonicalize_path('/');
|
|
|
|
|
SELECT test_canonicalize_path('/./abc/def/');
|
|
|
|
|
SELECT test_canonicalize_path('/./../abc/def');
|
|
|
|
|
SELECT test_canonicalize_path('/./../../abc/def/');
|
|
|
|
|
SELECT test_canonicalize_path('/abc/.././def/ghi');
|
|
|
|
|
SELECT test_canonicalize_path('/abc/./../def/ghi//');
|
|
|
|
|
SELECT test_canonicalize_path('/abc/def/../..');
|
|
|
|
|
SELECT test_canonicalize_path('/abc/def/../../..');
|
|
|
|
|
SELECT test_canonicalize_path('/abc/def/../../../../ghi/jkl');
|
|
|
|
|
SELECT test_canonicalize_path('.');
|
|
|
|
|
SELECT test_canonicalize_path('./');
|
|
|
|
|
SELECT test_canonicalize_path('./abc/..');
|
|
|
|
|
SELECT test_canonicalize_path('abc/../');
|
|
|
|
|
SELECT test_canonicalize_path('abc/../def');
|
|
|
|
|
SELECT test_canonicalize_path('..');
|
|
|
|
|
SELECT test_canonicalize_path('../abc/def');
|
|
|
|
|
SELECT test_canonicalize_path('../abc/..');
|
|
|
|
|
SELECT test_canonicalize_path('../abc/../def');
|
|
|
|
|
SELECT test_canonicalize_path('../abc/../../def/ghi');
|
|
|
|
|
SELECT test_canonicalize_path('./abc/./def/.');
|
|
|
|
|
SELECT test_canonicalize_path('./abc/././def/.');
|
|
|
|
|
SELECT test_canonicalize_path('./abc/./def/.././ghi/../../../jkl/mno');
|
|
|
|
|
|
Add function to log the memory contexts of specified backend process.
Commit 3e98c0bafb added pg_backend_memory_contexts view to display
the memory contexts of the backend process. However its target process
is limited to the backend that is accessing to the view. So this is
not so convenient when investigating the local memory bloat of other
backend process. To improve this situation, this commit adds
pg_log_backend_memory_contexts() function that requests to log
the memory contexts of the specified backend process.
This information can be also collected by calling
MemoryContextStats(TopMemoryContext) via a debugger. But
this technique cannot be used in some environments because no debugger
is available there. So, pg_log_backend_memory_contexts() allows us to
see the memory contexts of specified backend more easily.
Only superusers are allowed to request to log the memory contexts
because allowing any users to issue this request at an unbounded rate
would cause lots of log messages and which can lead to denial of service.
On receipt of the request, at the next CHECK_FOR_INTERRUPTS(),
the target backend logs its memory contexts at LOG_SERVER_ONLY level,
so that these memory contexts will appear in the server log but not
be sent to the client. It logs one message per memory context.
Because if it buffers all memory contexts into StringInfo to log them
as one message, which may require the buffer to be enlarged very much
and lead to OOM error since there can be a large number of memory
contexts in a backend.
When a backend process is consuming huge memory, logging all its
memory contexts might overrun available disk space. To prevent this,
now this patch limits the number of child contexts to log per parent
to 100. As with MemoryContextStats(), it supposes that practical cases
where the log gets long will typically be huge numbers of siblings
under the same parent context; while the additional debugging value
from seeing details about individual siblings beyond 100 will not be large.
There was another proposed patch to add the function to return
the memory contexts of specified backend as the result sets,
instead of logging them, in the discussion. However that patch is
not included in this commit because it had several issues to address.
Thanks to Tatsuhito Kasahara, Andres Freund, Tom Lane, Tomas Vondra,
Michael Paquier, Kyotaro Horiguchi and Zhihong Yu for the discussion.
Bump catalog version.
Author: Atsushi Torikoshi
Reviewed-by: Kyotaro Horiguchi, Zhihong Yu, Fujii Masao
Discussion: https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com
2021-04-06 00:44:15 -04:00
|
|
|
--
|
|
|
|
|
-- pg_log_backend_memory_contexts()
|
|
|
|
|
--
|
|
|
|
|
-- Memory contexts are logged and they are not returned to the function.
|
|
|
|
|
-- Furthermore, their contents can vary depending on the timing. However,
|
2021-10-26 16:13:52 -04:00
|
|
|
-- we can at least verify that the code doesn't fail, and that the
|
|
|
|
|
-- permissions are set properly.
|
Add function to log the memory contexts of specified backend process.
Commit 3e98c0bafb added pg_backend_memory_contexts view to display
the memory contexts of the backend process. However its target process
is limited to the backend that is accessing to the view. So this is
not so convenient when investigating the local memory bloat of other
backend process. To improve this situation, this commit adds
pg_log_backend_memory_contexts() function that requests to log
the memory contexts of the specified backend process.
This information can be also collected by calling
MemoryContextStats(TopMemoryContext) via a debugger. But
this technique cannot be used in some environments because no debugger
is available there. So, pg_log_backend_memory_contexts() allows us to
see the memory contexts of specified backend more easily.
Only superusers are allowed to request to log the memory contexts
because allowing any users to issue this request at an unbounded rate
would cause lots of log messages and which can lead to denial of service.
On receipt of the request, at the next CHECK_FOR_INTERRUPTS(),
the target backend logs its memory contexts at LOG_SERVER_ONLY level,
so that these memory contexts will appear in the server log but not
be sent to the client. It logs one message per memory context.
Because if it buffers all memory contexts into StringInfo to log them
as one message, which may require the buffer to be enlarged very much
and lead to OOM error since there can be a large number of memory
contexts in a backend.
When a backend process is consuming huge memory, logging all its
memory contexts might overrun available disk space. To prevent this,
now this patch limits the number of child contexts to log per parent
to 100. As with MemoryContextStats(), it supposes that practical cases
where the log gets long will typically be huge numbers of siblings
under the same parent context; while the additional debugging value
from seeing details about individual siblings beyond 100 will not be large.
There was another proposed patch to add the function to return
the memory contexts of specified backend as the result sets,
instead of logging them, in the discussion. However that patch is
not included in this commit because it had several issues to address.
Thanks to Tatsuhito Kasahara, Andres Freund, Tom Lane, Tomas Vondra,
Michael Paquier, Kyotaro Horiguchi and Zhihong Yu for the discussion.
Bump catalog version.
Author: Atsushi Torikoshi
Reviewed-by: Kyotaro Horiguchi, Zhihong Yu, Fujii Masao
Discussion: https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com
2021-04-06 00:44:15 -04:00
|
|
|
--
|
2021-10-26 16:13:52 -04:00
|
|
|
|
|
|
|
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
|
|
|
|
|
2022-01-11 09:19:59 -05:00
|
|
|
SELECT pg_log_backend_memory_contexts(pid) FROM pg_stat_activity
|
|
|
|
|
WHERE backend_type = 'checkpointer';
|
|
|
|
|
|
2021-10-26 16:13:52 -04:00
|
|
|
CREATE ROLE regress_log_memory;
|
|
|
|
|
|
|
|
|
|
SELECT has_function_privilege('regress_log_memory',
|
|
|
|
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- no
|
|
|
|
|
|
|
|
|
|
GRANT EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
|
|
|
|
TO regress_log_memory;
|
|
|
|
|
|
|
|
|
|
SELECT has_function_privilege('regress_log_memory',
|
|
|
|
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- yes
|
|
|
|
|
|
|
|
|
|
SET ROLE regress_log_memory;
|
|
|
|
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
|
|
|
|
RESET ROLE;
|
|
|
|
|
|
|
|
|
|
REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
|
|
|
|
FROM regress_log_memory;
|
|
|
|
|
|
|
|
|
|
DROP ROLE regress_log_memory;
|
Add function to log the memory contexts of specified backend process.
Commit 3e98c0bafb added pg_backend_memory_contexts view to display
the memory contexts of the backend process. However its target process
is limited to the backend that is accessing to the view. So this is
not so convenient when investigating the local memory bloat of other
backend process. To improve this situation, this commit adds
pg_log_backend_memory_contexts() function that requests to log
the memory contexts of the specified backend process.
This information can be also collected by calling
MemoryContextStats(TopMemoryContext) via a debugger. But
this technique cannot be used in some environments because no debugger
is available there. So, pg_log_backend_memory_contexts() allows us to
see the memory contexts of specified backend more easily.
Only superusers are allowed to request to log the memory contexts
because allowing any users to issue this request at an unbounded rate
would cause lots of log messages and which can lead to denial of service.
On receipt of the request, at the next CHECK_FOR_INTERRUPTS(),
the target backend logs its memory contexts at LOG_SERVER_ONLY level,
so that these memory contexts will appear in the server log but not
be sent to the client. It logs one message per memory context.
Because if it buffers all memory contexts into StringInfo to log them
as one message, which may require the buffer to be enlarged very much
and lead to OOM error since there can be a large number of memory
contexts in a backend.
When a backend process is consuming huge memory, logging all its
memory contexts might overrun available disk space. To prevent this,
now this patch limits the number of child contexts to log per parent
to 100. As with MemoryContextStats(), it supposes that practical cases
where the log gets long will typically be huge numbers of siblings
under the same parent context; while the additional debugging value
from seeing details about individual siblings beyond 100 will not be large.
There was another proposed patch to add the function to return
the memory contexts of specified backend as the result sets,
instead of logging them, in the discussion. However that patch is
not included in this commit because it had several issues to address.
Thanks to Tatsuhito Kasahara, Andres Freund, Tom Lane, Tomas Vondra,
Michael Paquier, Kyotaro Horiguchi and Zhihong Yu for the discussion.
Bump catalog version.
Author: Atsushi Torikoshi
Reviewed-by: Kyotaro Horiguchi, Zhihong Yu, Fujii Masao
Discussion: https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com
2021-04-06 00:44:15 -04:00
|
|
|
|
Avoid holding a directory FD open across pg_ls_dir_files() calls.
This coding technique is undesirable because (a) it leaks the FD for
the rest of the transaction if the SRF is not run to completion, and
(b) allocated FDs are a scarce resource, but multiple interleaved
uses of the relevant functions could eat many such FDs.
In v11 and later, a query such as "SELECT pg_ls_waldir() LIMIT 1"
yields a warning about the leaked FD, and the only reason there's
no warning in earlier branches is that fd.c didn't whine about such
leaks before commit 9cb7db3f0. Even disregarding the warning, it
wouldn't be too hard to run a backend out of FDs with careless use
of these SQL functions.
Hence, rewrite the function so that it reads the directory within
a single call, returning the results as a tuplestore rather than
via value-per-call mode.
There are half a dozen other built-in SRFs with similar problems,
but let's fix this one to start with, just to see if the buildfarm
finds anything wrong with the code.
In passing, fix bogus error report for stat() failure: it was
whining about the directory when it should be fingering the
individual file. Doubtless a copy-and-paste error.
Back-patch to v10 where this function was added.
Justin Pryzby, with cosmetic tweaks and test cases by me
Discussion: https://postgr.es/m/20200308173103.GC1357@telsasoft.com
2020-03-11 15:27:59 -04:00
|
|
|
--
|
|
|
|
|
-- Test some built-in SRFs
|
|
|
|
|
--
|
|
|
|
|
-- The outputs of these are variable, so we can't just print their results
|
|
|
|
|
-- directly, but we can at least verify that the code doesn't fail.
|
|
|
|
|
--
|
|
|
|
|
select setting as segsize
|
|
|
|
|
from pg_settings where name = 'wal_segment_size'
|
|
|
|
|
\gset
|
|
|
|
|
|
|
|
|
|
select count(*) > 0 as ok from pg_ls_waldir();
|
|
|
|
|
-- Test ProjectSet as well as FunctionScan
|
|
|
|
|
select count(*) > 0 as ok from (select pg_ls_waldir()) ss;
|
|
|
|
|
-- Test not-run-to-completion cases.
|
|
|
|
|
select * from pg_ls_waldir() limit 0;
|
|
|
|
|
select count(*) > 0 as ok from (select * from pg_ls_waldir() limit 1) ss;
|
2020-03-11 18:23:57 -04:00
|
|
|
select (w).size = :segsize as ok
|
|
|
|
|
from (select pg_ls_waldir() w) ss where length((w).name) = 24 limit 1;
|
Avoid holding a directory FD open across pg_ls_dir_files() calls.
This coding technique is undesirable because (a) it leaks the FD for
the rest of the transaction if the SRF is not run to completion, and
(b) allocated FDs are a scarce resource, but multiple interleaved
uses of the relevant functions could eat many such FDs.
In v11 and later, a query such as "SELECT pg_ls_waldir() LIMIT 1"
yields a warning about the leaked FD, and the only reason there's
no warning in earlier branches is that fd.c didn't whine about such
leaks before commit 9cb7db3f0. Even disregarding the warning, it
wouldn't be too hard to run a backend out of FDs with careless use
of these SQL functions.
Hence, rewrite the function so that it reads the directory within
a single call, returning the results as a tuplestore rather than
via value-per-call mode.
There are half a dozen other built-in SRFs with similar problems,
but let's fix this one to start with, just to see if the buildfarm
finds anything wrong with the code.
In passing, fix bogus error report for stat() failure: it was
whining about the directory when it should be fingering the
individual file. Doubtless a copy-and-paste error.
Back-patch to v10 where this function was added.
Justin Pryzby, with cosmetic tweaks and test cases by me
Discussion: https://postgr.es/m/20200308173103.GC1357@telsasoft.com
2020-03-11 15:27:59 -04:00
|
|
|
|
|
|
|
|
select count(*) >= 0 as ok from pg_ls_archive_statusdir();
|
|
|
|
|
|
2020-03-16 21:05:28 -04:00
|
|
|
select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1;
|
|
|
|
|
|
|
|
|
|
select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1;
|
|
|
|
|
|
|
|
|
|
select count(*) > 0 from
|
|
|
|
|
(select pg_tablespace_databases(oid) as pts from pg_tablespace
|
|
|
|
|
where spcname = 'pg_default') pts
|
|
|
|
|
join pg_database db on pts.pts = db.oid;
|
|
|
|
|
|
2021-11-23 05:29:42 -05:00
|
|
|
--
|
|
|
|
|
-- Test replication slot directory functions
|
|
|
|
|
--
|
|
|
|
|
CREATE ROLE regress_slot_dir_funcs;
|
|
|
|
|
-- Not available by default.
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_logicalsnapdir()', 'EXECUTE');
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_logicalmapdir()', 'EXECUTE');
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_replslotdir(text)', 'EXECUTE');
|
|
|
|
|
GRANT pg_monitor TO regress_slot_dir_funcs;
|
|
|
|
|
-- Role is now part of pg_monitor, so these are available.
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_logicalsnapdir()', 'EXECUTE');
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_logicalmapdir()', 'EXECUTE');
|
|
|
|
|
SELECT has_function_privilege('regress_slot_dir_funcs',
|
|
|
|
|
'pg_ls_replslotdir(text)', 'EXECUTE');
|
|
|
|
|
DROP ROLE regress_slot_dir_funcs;
|
|
|
|
|
|
2019-02-09 18:32:23 -05:00
|
|
|
--
|
|
|
|
|
-- Test adding a support function to a subject function
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
CREATE FUNCTION my_int_eq(int, int) RETURNS bool
|
|
|
|
|
LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE
|
|
|
|
|
AS $$int4eq$$;
|
|
|
|
|
|
|
|
|
|
-- By default, planner does not think that's selective
|
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
|
SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1
|
|
|
|
|
WHERE my_int_eq(a.unique2, 42);
|
|
|
|
|
|
|
|
|
|
-- With support function that knows it's int4eq, we get a different plan
|
|
|
|
|
ALTER FUNCTION my_int_eq(int, int) SUPPORT test_support_func;
|
|
|
|
|
|
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
|
SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1
|
|
|
|
|
WHERE my_int_eq(a.unique2, 42);
|
|
|
|
|
|
|
|
|
|
-- Also test non-default rowcount estimate
|
|
|
|
|
CREATE FUNCTION my_gen_series(int, int) RETURNS SETOF integer
|
|
|
|
|
LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE
|
|
|
|
|
AS $$generate_series_int4$$
|
|
|
|
|
SUPPORT test_support_func;
|
|
|
|
|
|
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
|
SELECT * FROM tenk1 a JOIN my_gen_series(1,1000) g ON a.unique1 = g;
|
|
|
|
|
|
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
|
SELECT * FROM tenk1 a JOIN my_gen_series(1,10) g ON a.unique1 = g;
|