From adbbcc064f7c18e49ebb5ce3ff91308e8816d5c8 Mon Sep 17 00:00:00 2001 From: Dmitry Yemanov Date: Tue, 12 Sep 2023 20:33:40 +0300 Subject: [PATCH] Fixed crash when IN predicate is delivered into aggregates/unions --- src/jrd/RecordSourceNodes.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/jrd/RecordSourceNodes.cpp b/src/jrd/RecordSourceNodes.cpp index b533470760..bc53b6e5ae 100644 --- a/src/jrd/RecordSourceNodes.cpp +++ b/src/jrd/RecordSourceNodes.cpp @@ -3723,7 +3723,11 @@ static void genDeliverUnmapped(CompilerScratch* csb, children.add(cmpNode->arg2); } else if (listNode) + { children.add(listNode->arg); + for (auto item : listNode->list->items) + children.add(item); + } else if (missingNode) children.add(missingNode->arg); else @@ -3766,7 +3770,7 @@ static void genDeliverUnmapped(CompilerScratch* csb, newListNode->list = FB_NEW_POOL(pool) ValueListNode(pool, count); newChildren.add(newListNode->arg.getAddress()); - for (auto item : newListNode->list->items) + for (auto& item : newListNode->list->items) newChildren.add(item.getAddress()); deliverNode = newListNode; @@ -3819,7 +3823,17 @@ static void genDeliverUnmapped(CompilerScratch* csb, } if (okNode) - deliverStack.push(deliverNode.release()); + { + const auto node = deliverNode.release(); + + if (const auto newListNode = nodeAs(node)) + { + newListNode->lookup = FB_NEW_POOL(pool) + LookupValueList(pool, newListNode->list, newListNode->impureOffset); + } + + deliverStack.push(node); + } } }