Browse Source

HPCC-22421 Fix obscure problem serializing a row from an active dataset

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 6 years ago
parent
commit
895aebf1d3
4 changed files with 23 additions and 4 deletions
  1. 1 0
      ecl/hqlcpp/hqlcpp.ipp
  2. 4 1
      ecl/hqlcpp/hqlcppds.cpp
  3. 17 3
      ecl/hqlcpp/hqlhtcpp.cpp
  4. 1 0
      ecl/hqlcpp/hqlhtcpp.ipp

+ 1 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -355,6 +355,7 @@ public:
     virtual IHqlExpression * queryExpr() = 0;
     virtual ITypeInfo * queryType() = 0;
     virtual IReferenceSelector * select(BuildCtx & ctx, IHqlExpression * selectExpr) = 0;
+    virtual IReferenceSelector * selectActiveRow() = 0;
     virtual BoundRow * getRow(BuildCtx & ctx) = 0;
 };
 

+ 4 - 1
ecl/hqlcpp/hqlcppds.cpp

@@ -467,7 +467,10 @@ IReferenceSelector * HqlCppTranslator::buildNewRow(BuildCtx & ctx, IHqlExpressio
     switch (op)
     {
     case no_activerow:
-        return buildActiveRow(ctx, expr->queryChild(0));
+    {
+        Owned<IReferenceSelector> active = buildActiveRow(ctx, expr->queryChild(0));
+        return active->selectActiveRow();
+    }
     case no_if:
         return doBuildRowIf(ctx, expr);
     case no_case:

+ 17 - 3
ecl/hqlcpp/hqlhtcpp.cpp

@@ -2668,9 +2668,17 @@ size32_t DatasetSelector::getContainerTrailingFixed()
 
 void DatasetSelector::getSize(BuildCtx & ctx, CHqlBoundExpr & bound)
 {
-    //OwnedHqlExpr mapped = row->getMappedSelector(ctx, this);
-    assertex(!row->isNonLocal());
-    column->buildSizeOf(translator, ctx, this, bound);
+    OwnedHqlExpr mapped = row->getMappedSelector(ctx, this);
+    if (mapped)
+    {
+        OwnedHqlExpr sizeOfExpr = createValue(no_sizeof, makeIntType(4, false), mapped.getClear());
+        translator.buildCachedExpr(ctx, sizeOfExpr, bound);
+    }
+    else
+    {
+        assertex(!row->isNonLocal());
+        column->buildSizeOf(translator, ctx, this, bound);
+    }
 }
 
 bool DatasetSelector::isDataset()
@@ -2878,6 +2886,12 @@ IReferenceSelector * DatasetSelector::select(BuildCtx & ctx, IHqlExpression * se
     return createChild(row, newColumn, selected);
 }
 
+IReferenceSelector * DatasetSelector::selectActiveRow()
+{
+    OwnedHqlExpr activePath = createRow(no_activerow, LINK(path));
+    return new DatasetSelector(translator, row, activePath);
+}
+
 BoundRow * DatasetSelector::getRow(BuildCtx & ctx)
 {
     if (isRoot())

+ 1 - 0
ecl/hqlcpp/hqlhtcpp.ipp

@@ -284,6 +284,7 @@ public:
     virtual void set(BuildCtx & ctx, IHqlExpression * expr);
     virtual void setRow(BuildCtx & ctx, IReferenceSelector * rhs);
     virtual IReferenceSelector * select(BuildCtx & ctx, IHqlExpression * selectExpr);
+    virtual IReferenceSelector * selectActiveRow();
 
     virtual void buildDeserialize(BuildCtx & ctx, IHqlExpression * helper, IAtom * serializeForm);
     virtual void buildSerialize(BuildCtx & ctx, IHqlExpression * helper, IAtom * serializeForm);