Skip to content

Commit 3f35248

Browse files
committed
Fix #8437 - Segmentation fault when running query with partition by and subquery
1 parent 8d6c46e commit 3f35248

File tree

2 files changed

+15
-18
lines changed

2 files changed

+15
-18
lines changed

src/dsql/ExprNodes.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11163,10 +11163,10 @@ static RegisterNode<SubQueryNode> regSubQueryNode({
1116311163
blr_via, blr_from, blr_average, blr_count, blr_maximum, blr_minimum, blr_total
1116411164
});
1116511165

11166-
SubQueryNode::SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse,
11166+
SubQueryNode::SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, SelectExprNode* aDsqlSelectExpr,
1116711167
ValueExprNode* aValue1, ValueExprNode* aValue2)
1116811168
: TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUERY>(pool),
11169-
dsqlRse(aDsqlRse),
11169+
dsqlSelectExpr(aDsqlSelectExpr),
1117011170
value1(aValue1),
1117111171
value2(aValue2),
1117211172
subQuery(NULL),
@@ -11210,11 +11210,7 @@ void SubQueryNode::getChildren(NodeRefsHolder& holder, bool dsql) const
1121011210
{
1121111211
ValueExprNode::getChildren(holder, dsql);
1121211212

11213-
if (dsql)
11214-
holder.add(dsqlRse);
11215-
else
11216-
holder.add(rse);
11217-
11213+
holder.add(rse);
1121811214
holder.add(value1);
1121911215
holder.add(value2);
1122011216
}
@@ -11225,7 +11221,7 @@ string SubQueryNode::internalPrint(NodePrinter& printer) const
1122511221

1122611222
NODE_PRINT(printer, blrOp);
1122711223
NODE_PRINT(printer, ownSavepoint);
11228-
NODE_PRINT(printer, dsqlRse);
11224+
NODE_PRINT(printer, dsqlSelectExpr);
1122911225
NODE_PRINT(printer, rse);
1123011226
NODE_PRINT(printer, value1);
1123111227
NODE_PRINT(printer, value2);
@@ -11244,10 +11240,11 @@ ValueExprNode* SubQueryNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
1124411240

1124511241
const DsqlContextStack::iterator base(*dsqlScratch->context);
1124611242

11247-
RseNode* rse = PASS1_rse(dsqlScratch, nodeAs<SelectExprNode>(dsqlRse));
11243+
RseNode* rse = PASS1_rse(dsqlScratch, dsqlSelectExpr);
1124811244

11249-
SubQueryNode* node = FB_NEW_POOL(dsqlScratch->getPool()) SubQueryNode(dsqlScratch->getPool(), blrOp, rse,
11245+
SubQueryNode* node = FB_NEW_POOL(dsqlScratch->getPool()) SubQueryNode(dsqlScratch->getPool(), blrOp, dsqlSelectExpr,
1125011246
rse->dsqlSelectList->items[0], NullNode::instance());
11247+
node->rse = rse;
1125111248

1125211249
node->line = line;
1125311250
node->column = column;
@@ -11268,7 +11265,7 @@ void SubQueryNode::genBlr(DsqlCompilerScratch* dsqlScratch)
1126811265
dsqlScratch->appendUChar(blrOp);
1126911266

1127011267
dsqlScratch->putDebugSrcInfo(line, column);
11271-
GEN_expr(dsqlScratch, dsqlRse);
11268+
GEN_expr(dsqlScratch, rse);
1127211269

1127311270
GEN_expr(dsqlScratch, value1);
1127411271
GEN_expr(dsqlScratch, value2);
@@ -11285,12 +11282,12 @@ void SubQueryNode::make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
1128511282

1128611283
bool SubQueryNode::dsqlAggregateFinder(AggregateFinder& visitor)
1128711284
{
11288-
return !visitor.ignoreSubSelects && visitor.visit(dsqlRse);
11285+
return !visitor.ignoreSubSelects && visitor.visit(rse);
1128911286
}
1129011287

1129111288
bool SubQueryNode::dsqlAggregate2Finder(Aggregate2Finder& visitor)
1129211289
{
11293-
return visitor.visit(dsqlRse); // Pass only the rse.
11290+
return visitor.visit(rse); // Pass only the rse.
1129411291
}
1129511292

1129611293
bool SubQueryNode::dsqlSubSelectFinder(SubSelectFinder& /*visitor*/)
@@ -11300,13 +11297,13 @@ bool SubQueryNode::dsqlSubSelectFinder(SubSelectFinder& /*visitor*/)
1130011297

1130111298
bool SubQueryNode::dsqlFieldFinder(FieldFinder& visitor)
1130211299
{
11303-
return visitor.visit(dsqlRse); // Pass only the rse.
11300+
return visitor.visit(rse); // Pass only the rse.
1130411301
}
1130511302

1130611303
ValueExprNode* SubQueryNode::dsqlFieldRemapper(FieldRemapper& visitor)
1130711304
{
11308-
doDsqlFieldRemapper(visitor, dsqlRse);
11309-
value1 = nodeAs<RseNode>(dsqlRse)->dsqlSelectList->items[0];
11305+
doDsqlFieldRemapper(visitor, rse);
11306+
value1 = rse->dsqlSelectList->items[0];
1131011307
return this;
1131111308
}
1131211309

src/dsql/ExprNodes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,7 @@ class StrLenNode final : public TypedNode<ValueExprNode, ExprNode::TYPE_STR_LEN>
19451945
class SubQueryNode final : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUERY>
19461946
{
19471947
public:
1948-
explicit SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse = NULL,
1948+
explicit SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, SelectExprNode* aDsqlSelectExpr = NULL,
19491949
ValueExprNode* aValue1 = NULL, ValueExprNode* aValue2 = NULL);
19501950

19511951
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, const UCHAR blrOp);
@@ -1995,7 +1995,7 @@ class SubQueryNode final : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUE
19951995
virtual dsc* execute(thread_db* tdbb, Request* request) const;
19961996

19971997
public:
1998-
NestConst<RecordSourceNode> dsqlRse;
1998+
NestConst<SelectExprNode> dsqlSelectExpr;
19991999
NestConst<RseNode> rse;
20002000
NestConst<ValueExprNode> value1;
20012001
NestConst<ValueExprNode> value2;

0 commit comments

Comments
 (0)