Changeset: adc2a2a9b7bc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/adc2a2a9b7bc
Modified Files:
        sql/server/rel_unnest.c
        sql/test/BugTracker-2026/Tests/7862-rel_has_freevar-crash.test
        sql/test/BugTracker-2026/Tests/All
Branch: Dec2025
Log Message:

Fix for #7862. Add a NULL check for input arg rel.


diffs (40 lines):

diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -163,9 +163,11 @@ rel_has_freevar(mvc *sql, sql_rel *rel)
                (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
                return 0;
        }
-
-       if (rel && is_independent(rel->used))
+       if (!rel)
                return 0;
+       if (is_independent(rel->used))
+               return 0;
+
        int res = 0;
        if (is_basetable(rel->op)) {
                res = 0;
diff --git a/sql/test/BugTracker-2026/Tests/7862-rel_has_freevar-crash.test 
b/sql/test/BugTracker-2026/Tests/7862-rel_has_freevar-crash.test
--- a/sql/test/BugTracker-2026/Tests/7862-rel_has_freevar-crash.test
+++ b/sql/test/BugTracker-2026/Tests/7862-rel_has_freevar-crash.test
@@ -14,9 +14,8 @@ NULL
 0
 
 -- Segmentation fault. in rel_has_freevar (sql=0x7f0a081844e0, rel=0x0) at 
sql/server/rel_unnest.c:170    if (is_basetable(rel->op)) {  -- cause of seg 
fault: rel=0x0
-query II rowsort
+statement error 42000!Query too complex: running out of stack space
 SELECT x , CASE WHEN x > 12 THEN 1 ELSE 0 END AS x
   FROM ( SELECT 10 AS x UNION SELECT 11 AS x GROUP BY CUBE ( x , x ) UNION 
SELECT 12 AS x UNION SELECT 13 AS x )
  WHERE x IN ( WITH RECURSIVE x ( row_number ) AS ( SELECT 1 UNION SELECT x + 1 
FROM x WHERE x < 20 ) SELECT x AS x FROM x WHERE x NOT IN ( 8 , 12 , CAST( 
0.000000 AS FLOAT ) , 24 , 32 ) OR x = 512 GROUP BY x HAVING NOT x < ANY ( CASE 
WHEN NULLIF ( ( WITH RECURSIVE x ( x ) AS ( SELECT 1 UNION SELECT x + 1 FROM ( 
WITH RECURSIVE x ( x ) AS ( SELECT CASE WHEN x < - 13 * - ( 0 ) + 39 * - ( 
SELECT '1' ) + 0.100000 + 0.100000 THEN CAST( '-0' AS DOUBLE ) END UNION SELECT 
ROUND ( 70 , 2 ) FROM x ) SELECT * FROM ( SELECT 'b' AS x FROM x ) WHERE x NOT 
IN ( 'a' ) ) WHERE x < 8 ) SELECT - COUNT ( * ) FROM x AS x WHERE NOT ( - x ) 
BETWEEN - x AND NULL ) , NULL ) IS NULL THEN 1 ELSE 0 END AND 6 IN ( SELECT MAX 
( x ) , x < -1234567 , MAX ( x ) , MIN ( x ) , MAX ( x ) , MIN ( x ) ORDER BY 1 
, 2 LIMIT 0 OFFSET 0 ) ) )
-----
 
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -59,4 +59,4 @@ KNOWNFAIL?7774-insert-into-renamed-table
 7855-ntile
 7856-crash-exp-match
 7857-rollup-crash
-KNOWNFAIL?7862-rel_has_freevar-crash
+7862-rel_has_freevar-crash
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to