Skip to content

Commit e90e917

Browse files
committed
Fix problem with MERGE and DLTT
1 parent 627cd16 commit e90e917

3 files changed

Lines changed: 30 additions & 4 deletions

File tree

src/dsql/StmtNodes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7560,7 +7560,7 @@ StmtNode* MergeNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
75607560
auto& pool = dsqlScratch->getPool();
75617561

75627562
RecordSourceNode* source = usingClause; // USING
7563-
RelationSourceNode* target = relation; // INTO
7563+
RecordSourceNode* target = relation; // INTO
75647564

75657565
// Build a join between USING and INTO tables.
75667566
const auto join = FB_NEW_POOL(pool) RseNode(pool);
@@ -7599,7 +7599,7 @@ StmtNode* MergeNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
75997599
// Get the already processed relations.
76007600
const auto processedRse = nodeAs<RseNode>(mergeNode->rse->dsqlStreams->items[0]);
76017601
source = processedRse->dsqlStreams->items[0];
7602-
target = nodeAs<RelationSourceNode>(processedRse->dsqlStreams->items[1]);
7602+
target = processedRse->dsqlStreams->items[1];
76037603

76047604
mergeNode->oldContext = dsqlGetContext(target);
76057605

src/dsql/pass1.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,6 @@ void PASS1_expand_select_node(DsqlCompilerScratch* dsqlScratch, ExprNode* node,
14051405
{
14061406
FieldNode* fieldNode;
14071407

1408-
//// TODO: LocalTableSourceNode
14091408
if (auto rseNode = nodeAs<RseNode>(node))
14101409
{
14111410
ValueListNode* sub_items = rseNode->dsqlSelectList;
@@ -1497,6 +1496,33 @@ void PASS1_expand_select_node(DsqlCompilerScratch* dsqlScratch, ExprNode* node,
14971496
}
14981497
}
14991498
}
1499+
else if (auto localTableNode = nodeAs<LocalTableSourceNode>(node))
1500+
{
1501+
dsql_ctx* context = localTableNode->dsqlContext;
1502+
1503+
if (context->ctx_relation)
1504+
{
1505+
for (dsql_fld* field = context->ctx_relation->rel_fields; field; field = field->fld_next)
1506+
{
1507+
DEV_BLKCHK(field, dsql_type_fld);
1508+
1509+
NestConst<ValueExprNode> select_item = nullptr;
1510+
1511+
if (!hide_using || context->getImplicitJoinField(field->fld_name, select_item))
1512+
{
1513+
if (!select_item)
1514+
{
1515+
if (context->ctx_flags & CTX_null)
1516+
select_item = NullNode::instance();
1517+
else
1518+
select_item = MAKE_field(context, field, nullptr);
1519+
}
1520+
1521+
list->add(select_item);
1522+
}
1523+
}
1524+
}
1525+
}
15001526
else if ((fieldNode = nodeAs<FieldNode>(node)))
15011527
{
15021528
RecordSourceNode* recSource = NULL;

src/jrd/optimizer/OuterJoin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ OuterJoin::OuterJoin(thread_db* aTdbb, Optimizer* opt,
5757
auto& joinStream = joinStreams[pos];
5858
joinStream.node = node;
5959

60-
if (nodeIs<RelationSourceNode>(node) || nodeIs<LocalTableSourceNode>(node))
60+
if (nodeIs<RelationSourceNode>(node))
6161
{
6262
const auto stream = node->getStream();
6363
fb_assert(!(csb->csb_rpt[stream].csb_flags & csb_active));

0 commit comments

Comments
 (0)