Fix assertion failure in constify_now

The code added to support VIEWs did not account for the fact that
varno could be from a different nesting level and therefore not
be present in the current range table.
This commit is contained in:
Sven Klemm 2022-09-15 20:54:05 +02:00 committed by Sven Klemm
parent 85d0e16a98
commit ffd9dfb7eb
5 changed files with 42 additions and 0 deletions

View File

@ -83,6 +83,8 @@ is_valid_now_expr(OpExpr *op, List *rtable)
if (!IsA(tle->expr, Var))
return false;
var = castNode(Var, tle->expr);
if (var->varlevelsup != 0)
return false;
rte = list_nth(rte->subquery->rtable, var->varno - 1);
}

View File

@ -491,3 +491,14 @@ QUERY PLAN
DROP TABLE now_view_test CASCADE;
NOTICE: drop cascades to view now_view
-- #4709
-- test queries with constraints involving columns from different nesting levels
SELECT * FROM
(SELECT * FROM metrics m1 LIMIT 1) m1
INNER JOIN (SELECT * FROM metrics m2 LIMIT 1) m2 ON true,
LATERAL (SELECT m2.time FROM devices LIMIT 1) as subq_1
WHERE subq_1.time > m1.time;
time | device_id | v0 | v1 | v2 | v3 | time | device_id | v0 | v1 | v2 | v3 | time
------+-----------+----+----+----+----+------+-----------+----+----+----+----+------
(0 rows)

View File

@ -491,3 +491,14 @@ QUERY PLAN
DROP TABLE now_view_test CASCADE;
NOTICE: drop cascades to view now_view
-- #4709
-- test queries with constraints involving columns from different nesting levels
SELECT * FROM
(SELECT * FROM metrics m1 LIMIT 1) m1
INNER JOIN (SELECT * FROM metrics m2 LIMIT 1) m2 ON true,
LATERAL (SELECT m2.time FROM devices LIMIT 1) as subq_1
WHERE subq_1.time > m1.time;
time | device_id | v0 | v1 | v2 | v3 | time | device_id | v0 | v1 | v2 | v3 | time
------+-----------+----+----+----+----+------+-----------+----+----+----+----+------
(0 rows)

View File

@ -488,3 +488,14 @@ QUERY PLAN
DROP TABLE now_view_test CASCADE;
NOTICE: drop cascades to view now_view
-- #4709
-- test queries with constraints involving columns from different nesting levels
SELECT * FROM
(SELECT * FROM metrics m1 LIMIT 1) m1
INNER JOIN (SELECT * FROM metrics m2 LIMIT 1) m2 ON true,
LATERAL (SELECT m2.time FROM devices LIMIT 1) as subq_1
WHERE subq_1.time > m1.time;
time | device_id | v0 | v1 | v2 | v3 | time | device_id | v0 | v1 | v2 | v3 | time
------+-----------+----+----+----+----+------+-----------+----+----+----+----+------
(0 rows)

View File

@ -170,4 +170,11 @@ CREATE VIEW now_view AS SELECT time, device, avg(value) from now_view_test GROUP
:PREFIX SELECT * FROM now_view WHERE time > now() - '168h'::interval;
DROP TABLE now_view_test CASCADE;
-- #4709
-- test queries with constraints involving columns from different nesting levels
SELECT * FROM
(SELECT * FROM metrics m1 LIMIT 1) m1
INNER JOIN (SELECT * FROM metrics m2 LIMIT 1) m2 ON true,
LATERAL (SELECT m2.time FROM devices LIMIT 1) as subq_1
WHERE subq_1.time > m1.time;