These tests have been removed by
906ea101d0d5, due to some of them being
unstable in the buildfarm with low max_stack_depth values. They are now
reworked so as they should be more portable.
The tests to cover the findoprnd() overflows use a balanced tree to
avoid using too much stack, per a suggestion and an investigation by Tom
Lane.
Note: This is initially applied only on HEAD; a backpatch will follow
should the buildfarm be fine with the situation.
Discussion: https://postgr.es/m/agZc6XecyE7E7fep@paquier.xyz
Backpatch-through: 14
1 & 2 & 4 & ( 5 | !6 )
(1 row)
+-- Test for overflow of the int16 "left" field in findoprnd().
+-- This query uses a balanced binary tree to avoid using too much stack.
+DO $$
+DECLARE
+ e text := '1';
+BEGIN
+ FOR i IN 1..15 LOOP
+ e := '(' || e || '&' || e || ')';
+ END LOOP;
+ PERFORM ('0|' || e)::query_int;
+END;
+$$;
+ERROR: query_int expression is too complex
+CONTEXT: SQL statement "SELECT ('0|' || e)::query_int"
+PL/pgSQL function inline_code_block line 8 at PERFORM
-- test non-error-throwing input
SELECT str as "query_int",
pg_input_is_valid(str,'query_int') as ok,
SELECT '1&(2&(4&(5|6)))'::query_int;
SELECT '1&(2&(4&(5|!6)))'::query_int;
+-- Test for overflow of the int16 "left" field in findoprnd().
+-- This query uses a balanced binary tree to avoid using too much stack.
+DO $$
+DECLARE
+ e text := '1';
+BEGIN
+ FOR i IN 1..15 LOOP
+ e := '(' || e || '&' || e || ')';
+ END LOOP;
+ PERFORM ('0|' || e)::query_int;
+END;
+$$;
+
-- test non-error-throwing input
SELECT str as "query_int",
f
(1 row)
+-- Test for overflow of the int16 "left" field in findoprnd().
+-- This query uses a balanced binary tree to avoid using too much stack.
+DO $$
+DECLARE
+ e text := 'a';
+BEGIN
+ FOR i IN 1..14 LOOP
+ e := '(' || e || '&' || e || ')';
+ END LOOP;
+ PERFORM ('b|' || e)::ltxtquery;
+END;
+$$;
+ERROR: ltxtquery is too large
+CONTEXT: SQL statement "SELECT ('b|' || e)::ltxtquery"
+PL/pgSQL function inline_code_block line 8 at PERFORM
--arrays
SELECT '{1.2.3}'::ltree[] @> '1.2.3.4';
?column?
!tree & aWdf@* | ltxtquery | t | | | |
(8 rows)
+-- Test for overflow of lquery_level.totallen.
+SELECT (repeat('x', 255) || repeat('|' || repeat('x', 255), 256))::lquery;
+ERROR: lquery level is too large
+DETAIL: Total size of level exceeds the maximum allowed (65535 bytes).
+--- Test for overflow of lquery_level.numvar, with a set of single-char
+--- variants in one level.
+SELECT (repeat('a|', 65535) || 'a')::lquery;
+ERROR: lquery level has too many variants
+DETAIL: Number of variants exceeds the maximum allowed (65535).
SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_qw%*'::ltxtquery;
SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_rw%*'::ltxtquery;
+-- Test for overflow of the int16 "left" field in findoprnd().
+-- This query uses a balanced binary tree to avoid using too much stack.
+DO $$
+DECLARE
+ e text := 'a';
+BEGIN
+ FOR i IN 1..14 LOOP
+ e := '(' || e || '&' || e || ')';
+ END LOOP;
+ PERFORM ('b|' || e)::ltxtquery;
+END;
+$$;
+
--arrays
SELECT '{1.2.3}'::ltree[] @> '1.2.3.4';
('!tree & aWdf@*','ltxtquery'))
AS a(str,typ),
LATERAL pg_input_error_info(a.str, a.typ) as errinfo;
+
+-- Test for overflow of lquery_level.totallen.
+SELECT (repeat('x', 255) || repeat('|' || repeat('x', 255), 256))::lquery;
+
+--- Test for overflow of lquery_level.numvar, with a set of single-char
+--- variants in one level.
+SELECT (repeat('a|', 65535) || 'a')::lquery;