materialize icon indicating copy to clipboard operation
materialize copied to clipboard

stack exhaustion in mz_transform::Optimizer::optimize with nested unions

Open philip-stoev opened this issue 2 years ago • 0 comments

What version of Materialize are you using?

environmentd v0.26.1-dev (4604a289e) listening...

How did you install Materialize?

Docker image

What is the issue?

Running the query below results in stack exhaustion. The stack is 56K frames deep. The query is compicated, but is it really that complicated?

DROP SCHEMA public CASCADE;

CREATE SCHEMA public;

CREATE TABLE t1 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
CREATE INDEX t1i1 ON t1(f1);
CREATE INDEX t1i2 ON t1(f2, f1);

CREATE TABLE t2 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
CREATE INDEX t2i1 ON t2(f1);
CREATE INDEX i2i2 ON t2(f2, f1);

CREATE TABLE t3 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);

SELECT DISTINCT f1 FROM t2 WHERE f1 > 6 UNION ALL ( ( ( SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL INTERSECT  ( SELECT  f1 FROM t1  INTERSECT ALL ( ( ( SELECT DISTINCT f1 FROM t1 WHERE f1 < 8 UNION  SELECT  f1 FROM t1  ) UNION  SELECT DISTINCT MIN (  f1 ) FROM t2 WHERE f1 IS  NULL ) UNION ALL SELECT  MIN (  f2 ) FROM t1 WHERE f1 < 3 UNION ALL ( SELECT DISTINCT f1 FROM t1 WHERE f1 IS NOT NULL INTERSECT ALL SELECT  f2 FROM t1 WHERE f1 > 0 UNION  SELECT  COUNT ( DISTINCT f1 ) FROM t2 WHERE f1 > 7 ) UNION ALL SELECT  MAX (  f2 ) FROM t1  UNION ALL ( SELECT  f1 FROM t2  UNION  SELECT DISTINCT COUNT (  f1 ) FROM t2  EXCEPT ALL SELECT  f2 FROM t2  EXCEPT ALL SELECT  SUM (  f1 ) FROM t1 WHERE f1 > 6 INTERSECT ALL SELECT  f1 FROM t1 WHERE f1 IS  NULL ) EXCEPT ALL SELECT DISTINCT f2 FROM t2  INTERSECT ALL ( SELECT DISTINCT MAX (  f1 ) FROM t2 WHERE f1 IS  NULL INTERSECT  SELECT  f2 FROM t2 WHERE f1 IS NOT NULL ) EXCEPT ALL SELECT  f2 FROM t2 WHERE f1 = 7 INTERSECT  SELECT  f2 FROM t2 WHERE f1 > 1 ) ) EXCEPT ALL SELECT  f1 FROM t1 WHERE f1 IS  NULL EXCEPT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 < 7 INTERSECT  SELECT  MIN (  f1 ) FROM t1  ) EXCEPT ALL ( ( SELECT  f1 FROM t2 WHERE f1 > 7 UNION ALL ( SELECT  COUNT ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL EXCEPT ALL SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 < 5 ) UNION  ( ( SELECT  MIN (  f2 ) FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT  f1 FROM t2 WHERE f1 IS NOT NULL UNION ALL ( ( SELECT  COUNT (  f2 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL UNION  SELECT DISTINCT f2 FROM t2 WHERE f1 = 1 ) EXCEPT ALL SELECT DISTINCT MIN (  f2 ) FROM t1  ) ) EXCEPT ALL ( SELECT DISTINCT f1 FROM t1  INTERSECT ALL SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL EXCEPT ALL SELECT DISTINCT f2 FROM t1 WHERE f1 < 8 INTERSECT ALL SELECT  f2 FROM t1  INTERSECT ALL ( SELECT DISTINCT COUNT (  f2 ) FROM t1  EXCEPT  SELECT DISTINCT MIN (  f1 ) FROM t1 WHERE f1 IS  NULL ) EXCEPT  SELECT  f2 FROM t1 WHERE f1 < 5 UNION  SELECT DISTINCT f2 FROM t1 WHERE f1 < 2 UNION  SELECT  MAX (  f2 ) FROM t2 WHERE f1 IS  NULL UNION ALL SELECT DISTINCT COUNT (  f1 ) FROM t2  EXCEPT ALL SELECT  f1 FROM t1 WHERE f1 IS NOT NULL ) UNION  ( SELECT  f2 FROM t1 WHERE f1 IS  NULL INTERSECT  ( SELECT  SUM ( DISTINCT f1 ) FROM t2 WHERE f1 < 4 UNION ALL ( SELECT DISTINCT f2 FROM t2 WHERE f1 > 3 INTERSECT ALL SELECT DISTINCT COUNT (  f1 ) FROM t1  EXCEPT  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL ) ) UNION  SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL ) ) EXCEPT ALL ( ( SELECT DISTINCT f1 FROM t1 WHERE f1 > 5 UNION ALL ( ( SELECT DISTINCT SUM (  f2 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT  SELECT  COUNT ( DISTINCT f1 ) FROM t1 WHERE f1 IS NOT NULL UNION  SELECT  SUM ( DISTINCT f2 ) FROM t1 WHERE f1 = 2 ) EXCEPT ALL SELECT DISTINCT f2 FROM t1 WHERE f1 IS  NULL UNION ALL ( SELECT DISTINCT f1 FROM t2  INTERSECT  SELECT DISTINCT f1 FROM t2 WHERE f1 = 9 ) INTERSECT ALL SELECT  COUNT (  f2 ) FROM t2 WHERE f1 IS NOT NULL ) ) INTERSECT  ( ( ( SELECT DISTINCT f2 FROM t2 WHERE f1 IS  NULL INTERSECT  SELECT DISTINCT f1 FROM t1 WHERE f1 IS NOT NULL ) UNION  SELECT  f2 FROM t2 WHERE f1 = 2 ) INTERSECT ALL ( ( ( ( ( SELECT DISTINCT f2 FROM t2 WHERE f1 IS  NULL INTERSECT ALL ( SELECT DISTINCT f1 FROM t2 WHERE f1 < 2 EXCEPT  ( SELECT  f2 FROM t1  INTERSECT  SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t2 WHERE f1 = 5 ) ) INTERSECT ALL SELECT  MAX ( DISTINCT f2 ) FROM t2 WHERE f1 IS  NULL ) EXCEPT  ( ( SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t1 WHERE f1 < 3 EXCEPT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS  NULL ) EXCEPT  SELECT  SUM (  f1 ) FROM t1  EXCEPT  ( SELECT DISTINCT f1 FROM t2 WHERE f1 < 5 UNION ALL SELECT  SUM ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL EXCEPT  SELECT  SUM (  f2 ) FROM t1 WHERE f1 IS  NULL ) INTERSECT  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t1 WHERE f1 > 6 INTERSECT ALL ( SELECT  MAX (  f1 ) FROM t2 WHERE f1 IS  NULL INTERSECT ALL SELECT  f1 FROM t1  EXCEPT ALL ( ( SELECT DISTINCT f1 FROM t2 WHERE f1 > 3 EXCEPT ALL ( SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 IS  NULL INTERSECT  SELECT  MAX (  f1 ) FROM t2 WHERE f1 = 8 INTERSECT  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 IS  NULL UNION  SELECT  MIN ( DISTINCT f1 ) FROM t1  ) ) INTERSECT ALL SELECT  f2 FROM t1 WHERE f1 = 3 INTERSECT ALL SELECT DISTINCT MAX (  f1 ) FROM t1 WHERE f1 = 5 UNION ALL SELECT DISTINCT MAX (  f2 ) FROM t1 WHERE f1 IS  NULL INTERSECT ALL ( SELECT  COUNT ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL INTERSECT ALL SELECT  f2 FROM t2 WHERE f1 > 0 UNION ALL SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t2 WHERE f1 > 4 EXCEPT  SELECT DISTINCT f2 FROM t2 WHERE f1 IS NOT NULL ) UNION ALL ( ( ( SELECT DISTINCT f2 FROM t2 WHERE f1 > 6 EXCEPT  SELECT  SUM ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL ) UNION  SELECT  f1 FROM t2 WHERE f1 IS  NULL INTERSECT  SELECT DISTINCT f2 FROM t2 WHERE f1 > 3 EXCEPT ALL SELECT  f2 FROM t1 WHERE f1 IS  NULL EXCEPT ALL ( ( ( SELECT  COUNT (  f2 ) FROM t2  EXCEPT ALL ( SELECT DISTINCT f2 FROM t1 WHERE f1 = 1 EXCEPT ALL SELECT DISTINCT MIN (  f1 ) FROM t1  INTERSECT ALL SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t2 WHERE f1 = 1 INTERSECT  SELECT  f1 FROM t1 WHERE f1 > 5 EXCEPT ALL SELECT  SUM (  f1 ) FROM t1  EXCEPT ALL SELECT  MAX ( DISTINCT f1 ) FROM t2 WHERE f1 < 7 ) INTERSECT ALL SELECT DISTINCT COUNT ( DISTINCT f2 ) FROM t2 WHERE f1 IS  NULL EXCEPT ALL SELECT  f1 FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL SELECT  MAX ( DISTINCT f1 ) FROM t1 WHERE f1 IS NOT NULL ) INTERSECT  ( ( SELECT DISTINCT f1 FROM t1  INTERSECT  SELECT DISTINCT MIN ( DISTINCT f1 ) FROM t1 WHERE f1 = 4 ) EXCEPT  SELECT  f2 FROM t1 WHERE f1 = 0 ) ) INTERSECT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS NOT NULL ) ) EXCEPT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 < 8 EXCEPT ALL SELECT  MAX (  f1 ) FROM t2 WHERE f1 = 2 UNION  ( ( SELECT DISTINCT SUM (  f2 ) FROM t1 WHERE f1 > 0 INTERSECT  SELECT DISTINCT COUNT (  f1 ) FROM t1  INTERSECT  SELECT  MAX (  f1 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL ( SELECT DISTINCT f2 FROM t1  UNION ALL SELECT DISTINCT f1 FROM t2 WHERE f1 = 8 UNION ALL ( SELECT DISTINCT f2 FROM t2 WHERE f1 IS NOT NULL EXCEPT  SELECT DISTINCT MIN ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL ) EXCEPT  SELECT  f1 FROM t2 WHERE f1 IS NOT NULL ) ) EXCEPT  SELECT DISTINCT f2 FROM t1 WHERE f1 > 4 EXCEPT ALL ( SELECT DISTINCT f2 FROM t2  EXCEPT  ( SELECT  MAX (  f1 ) FROM t1 WHERE f1 < 7 EXCEPT ALL SELECT  MIN ( DISTINCT f1 ) FROM t1 WHERE f1 < 9 UNION ALL SELECT DISTINCT MAX (  f2 ) FROM t2 WHERE f1 = 7 INTERSECT  SELECT  COUNT (  f1 ) FROM t1  ) INTERSECT ALL SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t1  ) UNION ALL ( SELECT  f2 FROM t2  INTERSECT ALL SELECT DISTINCT f2 FROM t2  ) INTERSECT ALL SELECT DISTINCT MAX (  f1 ) FROM t2  UNION  SELECT  f1 FROM t2 WHERE f1 > 5 ) UNION  ( SELECT  MIN (  f2 ) FROM t1  INTERSECT ALL ( SELECT  f1 FROM t1  EXCEPT ALL SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1  EXCEPT  ( ( SELECT DISTINCT f2 FROM t1  INTERSECT  ( SELECT  f1 FROM t2  EXCEPT  SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL EXCEPT  SELECT DISTINCT MIN (  f2 ) FROM t1 WHERE f1 = 7 UNION ALL ( SELECT  SUM (  f2 ) FROM t1  INTERSECT ALL ( SELECT  MIN ( DISTINCT f1 ) FROM t1 WHERE f1 = 4 EXCEPT ALL SELECT  f1 FROM t1  ) ) EXCEPT  ( SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL UNION ALL ( SELECT DISTINCT f1 FROM t1 WHERE f1 = 9 EXCEPT  ( ( SELECT DISTINCT f1 FROM t1 WHERE f1 > 6 INTERSECT  ( SELECT DISTINCT f2 FROM t1 WHERE f1 IS  NULL UNION  ( SELECT  f1 FROM t1 WHERE f1 < 4 EXCEPT ALL ( SELECT DISTINCT f1 FROM t2  EXCEPT  SELECT  MIN ( DISTINCT f2 ) FROM t1 WHERE f1 < 9 UNION  SELECT DISTINCT MAX (  f1 ) FROM t1 WHERE f1 IS NOT NULL ) EXCEPT  ( SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2  INTERSECT ALL SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL ) ) EXCEPT  ( ( SELECT  MIN ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT DISTINCT f2 FROM t2 WHERE f1 IS  NULL INTERSECT ALL SELECT DISTINCT COUNT (  f1 ) FROM t2  INTERSECT  SELECT  f1 FROM t2 WHERE f1 IS  NULL UNION  SELECT DISTINCT MAX (  f1 ) FROM t2 WHERE f1 < 0 UNION ALL SELECT  MAX (  f1 ) FROM t1 WHERE f1 > 1 UNION  SELECT DISTINCT f1 FROM t2 WHERE f1 < 0 ) UNION  SELECT  MIN (  f2 ) FROM t1 WHERE f1 < 8 ) EXCEPT ALL ( SELECT DISTINCT f1 FROM t2  EXCEPT  SELECT DISTINCT SUM (  f2 ) FROM t2 WHERE f1 IS  NULL UNION ALL SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t1 WHERE f1 > 8 INTERSECT ALL SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t1  ) EXCEPT  ( SELECT DISTINCT f2 FROM t1 WHERE f1 > 7 INTERSECT  SELECT  f2 FROM t2  ) EXCEPT  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 > 0 ) EXCEPT  SELECT DISTINCT f2 FROM t1 WHERE f1 = 9 EXCEPT ALL SELECT  MAX ( DISTINCT f2 ) FROM t1 WHERE f1 > 6 INTERSECT  SELECT DISTINCT f1 FROM t1 WHERE f1 = 6 ) INTERSECT  SELECT  f1 FROM t1 WHERE f1 > 9 ) INTERSECT ALL SELECT  SUM (  f2 ) FROM t2  ) INTERSECT  ( SELECT DISTINCT f2 FROM t1  EXCEPT ALL SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL ) EXCEPT ALL SELECT  COUNT (  f1 ) FROM t2 WHERE f1 > 9 ) ) EXCEPT ALL SELECT  COUNT ( DISTINCT f2 ) FROM t1  ) INTERSECT ALL SELECT DISTINCT f1 FROM t2 WHERE f1 = 4 ) UNION ALL SELECT  f1 FROM t1 WHERE f1 IS NOT NULL ) INTERSECT  SELECT DISTINCT COUNT (  f2 ) FROM t1 WHERE f1 IS  NULL ) ) UNION ALL SELECT  f2 FROM t1  ) INTERSECT ALL SELECT DISTINCT f2 FROM t2  INTERSECT ALL SELECT DISTINCT f1 FROM t1  UNION  SELECT DISTINCT SUM (  f1 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL SELECT  f1 FROM t1 WHERE f1 < 5 UNION ALL SELECT DISTINCT MAX (  f2 ) FROM t1 WHERE f1 > 2 EXCEPT  SELECT  COUNT (  f1 ) FROM t1 WHERE f1 IS  NULL ) INTERSECT ALL ( SELECT DISTINCT SUM (  f2 ) FROM t2 WHERE f1 > 5 UNION ALL SELECT  f1 FROM t1 WHERE f1 IS  NULL EXCEPT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS  NULL ) INTERSECT  SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL UNION  SELECT  f1 FROM t1 WHERE f1 IS NOT NULL ) EXCEPT ALL SELECT  SUM (  f1 ) FROM t2  EXCEPT ALL ( SELECT DISTINCT MAX (  f2 ) FROM t1 WHERE f1 = 5 EXCEPT  ( SELECT  COUNT (  f2 ) FROM t2 WHERE f1 = 7 INTERSECT  ( ( SELECT  COUNT ( DISTINCT f1 ) FROM t2  EXCEPT ALL ( ( SELECT DISTINCT MIN (  f1 ) FROM t2 WHERE f1 < 8 UNION ALL SELECT  f1 FROM t1  ) EXCEPT  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t1 WHERE f1 IS NOT NULL INTERSECT ALL SELECT DISTINCT f2 FROM t2  ) ) INTERSECT  SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1  ) EXCEPT ALL ( SELECT  f1 FROM t2 WHERE f1 IS  NULL INTERSECT  ( SELECT  SUM (  f1 ) FROM t1 WHERE f1 IS NOT NULL EXCEPT ALL SELECT  f1 FROM t2 WHERE f1 IS NOT NULL ) UNION ALL ( ( ( ( SELECT  f2 FROM t2 WHERE f1 = 4 UNION ALL ( ( SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t1  EXCEPT  SELECT DISTINCT f2 FROM t2 WHERE f1 IS  NULL ) EXCEPT  SELECT  f2 FROM t1 WHERE f1 > 5 UNION  SELECT DISTINCT COUNT ( DISTINCT f2 ) FROM t1  INTERSECT  SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL UNION  ( SELECT  MAX ( DISTINCT f2 ) FROM t2 WHERE f1 = 8 INTERSECT ALL ( SELECT DISTINCT f2 FROM t1 WHERE f1 IS  NULL EXCEPT  SELECT DISTINCT MIN (  f2 ) FROM t2 WHERE f1 = 5 INTERSECT ALL SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL EXCEPT ALL SELECT DISTINCT f2 FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT  MAX ( DISTINCT f1 ) FROM t1  INTERSECT  SELECT  MAX (  f2 ) FROM t1  EXCEPT  SELECT DISTINCT COUNT (  f2 ) FROM t1 WHERE f1 IS  NULL UNION  ( ( ( ( SELECT  MAX ( DISTINCT f1 ) FROM t1  UNION ALL SELECT  SUM ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL ) EXCEPT  SELECT  MAX (  f2 ) FROM t2  EXCEPT ALL SELECT  MAX ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL UNION ALL SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t1 WHERE f1 < 0 ) UNION ALL SELECT  f2 FROM t2  UNION  SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL ) INTERSECT ALL ( SELECT  f1 FROM t2 WHERE f1 > 6 INTERSECT ALL SELECT DISTINCT f1 FROM t1  ) ) ) EXCEPT ALL SELECT  f1 FROM t1  ) ) ) INTERSECT  SELECT DISTINCT MAX (  f1 ) FROM t1  INTERSECT  SELECT DISTINCT f1 FROM t1  ) EXCEPT ALL ( SELECT  SUM (  f1 ) FROM t2 WHERE f1 < 2 EXCEPT  SELECT DISTINCT f1 FROM t2  ) ) UNION ALL SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1 WHERE f1 IS NOT NULL UNION  SELECT DISTINCT f1 FROM t1  UNION ALL ( SELECT DISTINCT MIN (  f1 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL SELECT DISTINCT f2 FROM t1 WHERE f1 < 7 ) INTERSECT ALL SELECT  f1 FROM t1 WHERE f1 = 3 INTERSECT  SELECT DISTINCT MAX (  f2 ) FROM t1 WHERE f1 > 0 EXCEPT ALL ( SELECT DISTINCT f2 FROM t1 WHERE f1 = 3 UNION  SELECT  COUNT ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS  NULL INTERSECT  ( SELECT DISTINCT f2 FROM t1 WHERE f1 IS  NULL INTERSECT ALL SELECT  MAX ( DISTINCT f2 ) FROM t2 WHERE f1 IS  NULL ) UNION ALL SELECT  MIN (  f1 ) FROM t1  UNION  SELECT  f2 FROM t1 WHERE f1 < 9 ) UNION ALL SELECT  SUM ( DISTINCT f1 ) FROM t2 WHERE f1 IS  NULL INTERSECT ALL SELECT DISTINCT f2 FROM t2 WHERE f1 = 4 EXCEPT  SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL ) INTERSECT  SELECT  f1 FROM t1 WHERE f1 = 0 ) EXCEPT  SELECT  COUNT (  f1 ) FROM t2  UNION  SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2 WHERE f1 = 5 ) UNION ALL SELECT DISTINCT f2 FROM t1  UNION  SELECT  f2 FROM t1 WHERE f1 IS NOT NULL ) EXCEPT  SELECT  SUM ( DISTINCT f1 ) FROM t2  UNION ALL ( ( ( SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t1  UNION ALL SELECT  f1 FROM t2  ) UNION ALL SELECT DISTINCT MIN ( DISTINCT f2 ) FROM t1  ) EXCEPT  SELECT DISTINCT COUNT (  f1 ) FROM t1  INTERSECT ALL SELECT DISTINCT f2 FROM t2  ) INTERSECT ALL ( SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL EXCEPT ALL SELECT  MAX ( DISTINCT f2 ) FROM t2 WHERE f1 < 7 ) INTERSECT ALL SELECT DISTINCT f2 FROM t1  UNION ALL ( SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1  INTERSECT ALL SELECT DISTINCT f1 FROM t2  EXCEPT  SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t1 WHERE f1 > 7 ) UNION ALL SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL EXCEPT  ( ( SELECT DISTINCT f1 FROM t2  UNION  SELECT  f1 FROM t2 WHERE f1 > 3 ) UNION ALL SELECT  f2 FROM t1  UNION  SELECT  MAX ( DISTINCT f1 ) FROM t1  ) ) EXCEPT ALL ( ( ( SELECT DISTINCT f2 FROM t2  EXCEPT ALL ( SELECT  SUM ( DISTINCT f2 ) FROM t1 WHERE f1 IS NOT NULL INTERSECT ALL ( SELECT DISTINCT f1 FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT  f1 FROM t1 WHERE f1 IS  NULL ) INTERSECT ALL SELECT DISTINCT MIN (  f2 ) FROM t1 WHERE f1 > 9 UNION  ( SELECT DISTINCT f1 FROM t1  EXCEPT ALL SELECT  COUNT ( DISTINCT f2 ) FROM t2 WHERE f1 > 0 ) ) ) EXCEPT  SELECT DISTINCT f2 FROM t2  EXCEPT ALL SELECT  f2 FROM t2 WHERE f1 < 5 UNION  ( SELECT DISTINCT SUM (  f2 ) FROM t2  EXCEPT ALL SELECT  COUNT (  f2 ) FROM t2 WHERE f1 IS  NULL EXCEPT  SELECT DISTINCT f2 FROM t2 WHERE f1 IS  NULL ) UNION  SELECT  MAX (  f2 ) FROM t1 WHERE f1 IS NOT NULL UNION  SELECT  MAX ( DISTINCT f1 ) FROM t1 WHERE f1 IS NOT NULL ) INTERSECT  ( ( SELECT DISTINCT f2 FROM t1 WHERE f1 IS  NULL INTERSECT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS NOT NULL INTERSECT  ( ( SELECT  MIN ( DISTINCT f2 ) FROM t2  UNION  ( ( SELECT  SUM (  f2 ) FROM t2 WHERE f1 IS  NULL EXCEPT ALL ( ( SELECT  f1 FROM t1  UNION  SELECT  f1 FROM t2 WHERE f1 IS  NULL ) EXCEPT ALL SELECT DISTINCT MIN ( DISTINCT f1 ) FROM t1 WHERE f1 IS NOT NULL ) ) UNION  SELECT  COUNT ( DISTINCT f2 ) FROM t2  ) UNION ALL ( ( SELECT DISTINCT f2 FROM t1 WHERE f1 > 5 EXCEPT  ( SELECT DISTINCT f2 FROM t1  INTERSECT  SELECT  f1 FROM t1 WHERE f1 < 2 UNION ALL SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL UNION ALL ( ( SELECT  f2 FROM t1 WHERE f1 = 3 INTERSECT  SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL ) EXCEPT ALL ( ( SELECT  f2 FROM t2 WHERE f1 < 5 EXCEPT  SELECT DISTINCT f2 FROM t2 WHERE f1 < 7 ) INTERSECT  SELECT  f2 FROM t1  UNION ALL ( ( ( SELECT  f1 FROM t1  UNION ALL SELECT DISTINCT f1 FROM t1  ) UNION  SELECT  f2 FROM t2  ) UNION ALL SELECT DISTINCT f2 FROM t1  UNION ALL SELECT DISTINCT COUNT ( DISTINCT f2 ) FROM t2  EXCEPT ALL SELECT  SUM (  f2 ) FROM t1 WHERE f1 > 9 INTERSECT  SELECT DISTINCT f1 FROM t2 WHERE f1 < 5 INTERSECT  SELECT  SUM (  f1 ) FROM t2 WHERE f1 < 0 INTERSECT ALL SELECT DISTINCT COUNT (  f1 ) FROM t1 WHERE f1 IS  NULL ) ) INTERSECT ALL ( SELECT DISTINCT MAX ( DISTINCT f2 ) FROM t2  EXCEPT ALL ( SELECT DISTINCT f2 FROM t2 WHERE f1 IS NOT NULL UNION  SELECT  f2 FROM t1  ) ) ) EXCEPT ALL ( SELECT DISTINCT f2 FROM t2  UNION  SELECT  f2 FROM t1 WHERE f1 > 0 ) INTERSECT ALL SELECT  f2 FROM t1  ) INTERSECT ALL SELECT DISTINCT SUM (  f2 ) FROM t1 WHERE f1 = 8 INTERSECT ALL ( ( ( SELECT  f2 FROM t2  UNION  SELECT DISTINCT SUM ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL EXCEPT  ( ( SELECT  f2 FROM t1  EXCEPT  SELECT  f2 FROM t2  ) EXCEPT  ( SELECT DISTINCT f2 FROM t2  INTERSECT ALL SELECT  f1 FROM t1 WHERE f1 IS  NULL ) ) INTERSECT  SELECT  COUNT (  f2 ) FROM t1  ) INTERSECT  SELECT DISTINCT f2 FROM t2 WHERE f1 > 7 ) UNION ALL SELECT  SUM (  f2 ) FROM t2 WHERE f1 = 3 ) ) INTERSECT ALL ( SELECT  f2 FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT DISTINCT f2 FROM t2 WHERE f1 IS NOT NULL UNION ALL SELECT  f2 FROM t1 WHERE f1 < 8 ) ) ) UNION ALL SELECT  f1 FROM t1 WHERE f1 IS NOT NULL ) ) EXCEPT  ( ( SELECT  f2 FROM t2  EXCEPT  ( ( SELECT  MIN ( DISTINCT f1 ) FROM t2 WHERE f1 IS NOT NULL UNION ALL ( ( SELECT DISTINCT f1 FROM t2 WHERE f1 > 2 INTERSECT ALL SELECT DISTINCT f1 FROM t1  EXCEPT ALL SELECT DISTINCT f2 FROM t1  UNION  SELECT DISTINCT MIN (  f2 ) FROM t1 WHERE f1 > 2 EXCEPT  SELECT  MAX (  f1 ) FROM t1  INTERSECT  SELECT  f2 FROM t1  ) INTERSECT ALL ( SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t2 WHERE f1 = 2 EXCEPT ALL ( ( SELECT DISTINCT COUNT ( DISTINCT f2 ) FROM t2  UNION  SELECT DISTINCT SUM (  f2 ) FROM t2 WHERE f1 IS NOT NULL EXCEPT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 IS  NULL EXCEPT ALL SELECT  MIN (  f1 ) FROM t1 WHERE f1 IS NOT NULL ) UNION  SELECT DISTINCT SUM (  f2 ) FROM t2  ) UNION  SELECT  f1 FROM t1 WHERE f1 IS  NULL ) INTERSECT ALL SELECT  f2 FROM t2 WHERE f1 IS NOT NULL EXCEPT  ( SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t1  INTERSECT ALL SELECT DISTINCT f1 FROM t1 WHERE f1 = 7 ) INTERSECT ALL SELECT  f2 FROM t2 WHERE f1 < 7 ) ) UNION ALL SELECT DISTINCT SUM ( DISTINCT f2 ) FROM t1 WHERE f1 = 3 UNION ALL SELECT  f2 FROM t2 WHERE f1 IS  NULL ) ) INTERSECT ALL ( ( SELECT  MAX (  f1 ) FROM t1  UNION ALL SELECT DISTINCT f2 FROM t2  UNION ALL SELECT DISTINCT f1 FROM t1 WHERE f1 < 9 ) EXCEPT  ( SELECT  MAX ( DISTINCT f2 ) FROM t2 WHERE f1 < 9 EXCEPT ALL SELECT  f2 FROM t2 WHERE f1 IS NOT NULL UNION ALL ( SELECT DISTINCT COUNT ( DISTINCT f1 ) FROM t1 WHERE f1 IS  NULL INTERSECT  SELECT  f2 FROM t2 WHERE f1 > 1 ) ) ) UNION  SELECT  SUM ( DISTINCT f2 ) FROM t1 WHERE f1 < 1 ) UNION ALL SELECT DISTINCT MAX (  f1 ) FROM t2  ) ) EXCEPT  SELECT  f1 FROM t2 WHERE f1 < 9 ) EXCEPT  SELECT  f1 FROM t1  INTERSECT  SELECT  f1 FROM t2  EXCEPT  ( SELECT DISTINCT f1 FROM t2  INTERSECT ALL ( SELECT DISTINCT MAX (  f2 ) FROM t2 WHERE f1 IS  NULL UNION ALL SELECT  f2 FROM t2 WHERE f1 IS NOT NULL INTERSECT  SELECT  f1 FROM t1 WHERE f1 IS NOT NULL UNION ALL SELECT  MIN ( DISTINCT f1 ) FROM t1  ) UNION ALL SELECT  f1 FROM t2 WHERE f1 IS NOT NULL ) INTERSECT  SELECT DISTINCT MIN (  f2 ) FROM t2  ) EXCEPT ALL SELECT  f1 FROM t1 WHERE f1 IS NOT NULL INTERSECT  SELECT DISTINCT f2 FROM t2 WHERE f1 = 6 ) INTERSECT  SELECT  SUM ( DISTINCT f2 ) FROM t1 WHERE f1 > 5 EXCEPT  SELECT  f1 FROM t1 WHERE f1 < 3 INTERSECT  ( ( ( SELECT  MAX ( DISTINCT f2 ) FROM t1  INTERSECT  SELECT DISTINCT MAX ( DISTINCT f1 ) FROM t2 WHERE f1 = 4 ) EXCEPT  SELECT  SUM (  f1 ) FROM t2 WHERE f1 IS  NULL ) INTERSECT  SELECT  f1 FROM t2  ) ) ) ) INTERSECT  ( SELECT DISTINCT SUM (  f1 ) FROM t1 WHERE f1 < 0 EXCEPT  SELECT  MIN (  f1 ) FROM t2  ) UNION ALL ( SELECT  SUM ( DISTINCT f2 ) FROM t2 WHERE f1 IS NOT NULL INTERSECT ALL SELECT  MIN (  f1 ) FROM t1 WHERE f1 > 9 ) EXCEPT ALL SELECT DISTINCT COUNT (  f2 ) FROM t2 WHERE f1 < 2 ) INTERSECT  ( SELECT  MIN ( DISTINCT f2 ) FROM t1 WHERE f1 IS  NULL UNION  SELECT DISTINCT COUNT (  f2 ) FROM t1 WHERE f1 IS  NULL ) INTERSECT  SELECT DISTINCT MAX (  f1 ) FROM t2 WHERE f1 IS  NULL ) EXCEPT  SELECT  f2 FROM t2 WHERE f1 > 8 ) ;

Relevant log output

(gdb) bt
#0  0x00007f0c59f01246 in __GI___pthread_mutex_trylock (mutex=0x7f0c42e08610) at ../nptl/pthread_mutex_trylock.c:38
#1  0x00005597902d6410 in _rjem_je_tcache_bin_flush_small ()
#2  0x0000559790259c76 in _rjem_je_sdallocx_default ()
#3  0x00005597904e7958 in core::ptr::drop_in_place<mz_expr::relation::MirRelationExpr> ()
...
#56511 0x00005597904e77eb in core::ptr::drop_in_place<mz_expr::relation::MirRelationExpr> ()
#56512 0x00005597904e77eb in core::ptr::drop_in_place<mz_expr::relation::MirRelationExpr> ()
#56513 0x00005597904f89a8 in mz_transform::Optimizer::optimize ()
#56514 0x000055978f94d802 in mz_adapter::coord::sequencer::<impl mz_adapter::coord::Coordinator<S>>::sequence_peek::{{closure}}::{{closure}} ()
#56515 0x000055978fd3ede2 in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56516 0x000055978f95edb8 in mz_adapter::coord::sequencer::<impl mz_adapter::coord::Coordinator<S>>::sequence_plan::{{closure}}::{{closure}} ()
#56517 0x000055978fcc4de2 in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56518 0x000055978fda3868 in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56519 0x000055978fdaefdd in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56520 0x000055978fd828bf in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56521 0x000055978fdb69c2 in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56522 0x000055978fed0e3e in <tracing::instrument::Instrumented<T> as core::future::future::Future>::poll ()
#56523 0x000055978f941dd7 in mz_adapter::coord::message_handler::<impl mz_adapter::coord::Coordinator<S>>::message_command::{{closure}}::{{closure}} ()
#56524 0x000055978f93cf63 in mz_adapter::coord::message_handler::<impl mz_adapter::coord::Coordinator<S>>::handle_message::{{closure}} ()
#56525 0x000055978fc52a21 in <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll ()
#56526 0x000055978f668abd in std::thread::local::LocalKey<T>::with ()
#56527 0x000055978f545e0f in tokio::park::thread::CachedParkThread::block_on ()
#56528 0x000055978fbd0e84 in tokio::runtime::handle::Handle::block_on ()
#56529 0x000055978f4c51fd in std::sys_common::backtrace::__rust_begin_short_backtrace ()
#56530 0x000055978f5eb2bd in core::ops::function::FnOnce::call_once{{vtable-shim}} ()
#56531 0x0000559792283b63 in std::sys::unix::thread::Thread::new::thread_start ()
#56532 0x00007f0c59efe609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#56533 0x00007f0c59ad1133 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

philip-stoev avatar Aug 09 '22 10:08 philip-stoev

Assigning to @ggevay for initial investigation.

aalexandrov avatar Aug 18 '22 13:08 aalexandrov

Merged https://github.com/MaterializeInc/materialize/pull/14441, after which this query doesn't cause a panic anymore, but instead prints a proper error msg to the user about hitting the recursion limit.

A proper fix that would allow the query to actually run, would probably involve making a variadic Let. @aalexandrov, if we don't have an issue for that already, then I'll create one.

I'm keeping this issue open, because it's still in our long-term plans to fix this. Very big queries should be supported, because:

  • @antiguru says that users will use BI tools to create monster queries;
  • @wangandi says that there was already one issue from a customer with a stack overflow, where the customer generated a big test query to test the limits of the optimizer.

ggevay avatar Aug 31 '22 15:08 ggevay

I'll close this issue because it relates to a specific incident that came from a bug triaging process. I'll create a seprate issue if we don't have one for making the plans more robust to stack overflows.

aalexandrov avatar Sep 02 '22 21:09 aalexandrov