Skip to content

Commit 8332082

Browse files
committed
Fix #8437 - Segmentation fault when running query with partition by and subquery
1 parent b642fb3 commit 8332082

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
@@ -11125,10 +11125,10 @@ static RegisterNode<SubQueryNode> regSubQueryNode({
1112511125
blr_via, blr_from, blr_average, blr_count, blr_maximum, blr_minimum, blr_total
1112611126
});
1112711127

11128-
SubQueryNode::SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse,
11128+
SubQueryNode::SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, SelectExprNode* aDsqlSelectExpr,
1112911129
ValueExprNode* aValue1, ValueExprNode* aValue2)
1113011130
: TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUERY>(pool),
11131-
dsqlRse(aDsqlRse),
11131+
dsqlSelectExpr(aDsqlSelectExpr),
1113211132
value1(aValue1),
1113311133
value2(aValue2),
1113411134
subQuery(NULL),
@@ -11172,11 +11172,7 @@ void SubQueryNode::getChildren(NodeRefsHolder& holder, bool dsql) const
1117211172
{
1117311173
ValueExprNode::getChildren(holder, dsql);
1117411174

11175-
if (dsql)
11176-
holder.add(dsqlRse);
11177-
else
11178-
holder.add(rse);
11179-
11175+
holder.add(rse);
1118011176
holder.add(value1);
1118111177
holder.add(value2);
1118211178
}
@@ -11187,7 +11183,7 @@ string SubQueryNode::internalPrint(NodePrinter& printer) const
1118711183

1118811184
NODE_PRINT(printer, blrOp);
1118911185
NODE_PRINT(printer, ownSavepoint);
11190-
NODE_PRINT(printer, dsqlRse);
11186+
NODE_PRINT(printer, dsqlSelectExpr);
1119111187
NODE_PRINT(printer, rse);
1119211188
NODE_PRINT(printer, value1);
1119311189
NODE_PRINT(printer, value2);
@@ -11206,10 +11202,11 @@ ValueExprNode* SubQueryNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
1120611202

1120711203
const DsqlContextStack::iterator base(*dsqlScratch->context);
1120811204

11209-
RseNode* rse = PASS1_rse(dsqlScratch, nodeAs<SelectExprNode>(dsqlRse));
11205+
RseNode* rse = PASS1_rse(dsqlScratch, dsqlSelectExpr);
1121011206

11211-
SubQueryNode* node = FB_NEW_POOL(dsqlScratch->getPool()) SubQueryNode(dsqlScratch->getPool(), blrOp, rse,
11207+
SubQueryNode* node = FB_NEW_POOL(dsqlScratch->getPool()) SubQueryNode(dsqlScratch->getPool(), blrOp, dsqlSelectExpr,
1121211208
rse->dsqlSelectList->items[0], NullNode::instance());
11209+
node->rse = rse;
1121311210

1121411211
node->line = line;
1121511212
node->column = column;
@@ -11230,7 +11227,7 @@ void SubQueryNode::genBlr(DsqlCompilerScratch* dsqlScratch)
1123011227
dsqlScratch->appendUChar(blrOp);
1123111228

1123211229
dsqlScratch->putDebugSrcInfo(line, column);
11233-
GEN_expr(dsqlScratch, dsqlRse);
11230+
GEN_expr(dsqlScratch, rse);
1123411231

1123511232
GEN_expr(dsqlScratch, value1);
1123611233
GEN_expr(dsqlScratch, value2);
@@ -11247,12 +11244,12 @@ void SubQueryNode::make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
1124711244

1124811245
bool SubQueryNode::dsqlAggregateFinder(AggregateFinder& visitor)
1124911246
{
11250-
return !visitor.ignoreSubSelects && visitor.visit(dsqlRse);
11247+
return !visitor.ignoreSubSelects && visitor.visit(rse);
1125111248
}
1125211249

1125311250
bool SubQueryNode::dsqlAggregate2Finder(Aggregate2Finder& visitor)
1125411251
{
11255-
return visitor.visit(dsqlRse); // Pass only the rse.
11252+
return visitor.visit(rse); // Pass only the rse.
1125611253
}
1125711254

1125811255
bool SubQueryNode::dsqlSubSelectFinder(SubSelectFinder& /*visitor*/)
@@ -11262,13 +11259,13 @@ bool SubQueryNode::dsqlSubSelectFinder(SubSelectFinder& /*visitor*/)
1126211259

1126311260
bool SubQueryNode::dsqlFieldFinder(FieldFinder& visitor)
1126411261
{
11265-
return visitor.visit(dsqlRse); // Pass only the rse.
11262+
return visitor.visit(rse); // Pass only the rse.
1126611263
}
1126711264

1126811265
ValueExprNode* SubQueryNode::dsqlFieldRemapper(FieldRemapper& visitor)
1126911266
{
11270-
doDsqlFieldRemapper(visitor, dsqlRse);
11271-
value1 = nodeAs<RseNode>(dsqlRse)->dsqlSelectList->items[0];
11267+
doDsqlFieldRemapper(visitor, rse);
11268+
value1 = rse->dsqlSelectList->items[0];
1127211269
return this;
1127311270
}
1127411271

src/dsql/ExprNodes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,7 @@ class StrLenNode final : public TypedNode<ValueExprNode, ExprNode::TYPE_STR_LEN>
19281928
class SubQueryNode final : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUERY>
19291929
{
19301930
public:
1931-
explicit SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse = NULL,
1931+
explicit SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, SelectExprNode* aDsqlSelectExpr = NULL,
19321932
ValueExprNode* aValue1 = NULL, ValueExprNode* aValue2 = NULL);
19331933

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

19801980
public:
1981-
NestConst<RecordSourceNode> dsqlRse;
1981+
NestConst<SelectExprNode> dsqlSelectExpr;
19821982
NestConst<RseNode> rse;
19831983
NestConst<ValueExprNode> value1;
19841984
NestConst<ValueExprNode> value2;

0 commit comments

Comments
 (0)