Browse Source

Merge pull request #12875 from ghalliday/issue22368

HPCC-22638 Fix problem with BUILD(key, dataset, <name>) when no filepos

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 5 years ago
parent
commit
fee2eaffd1
4 changed files with 19 additions and 6 deletions
  1. 3 0
      ecl/hql/hqlexpr.cpp
  2. 10 0
      ecl/hql/hqlgram2.cpp
  3. 5 5
      ecl/hql/hqlutil.cpp
  4. 1 1
      ecl/hqlcpp/hqlttcpp.cpp

+ 3 - 0
ecl/hql/hqlexpr.cpp

@@ -4679,6 +4679,9 @@ switch (op)
     case no_countdict:
         assertex(queryChild(0)->isDictionary());
         break;
+    case no_newusertable:
+        assertex(queryChild(2)->getOperator() == no_newtransform);
+        break;
     }
 
 #ifdef _DEBUG

+ 10 - 0
ecl/hql/hqlgram2.cpp

@@ -7113,7 +7113,17 @@ IHqlExpression * HqlGram::createBuildIndexFromIndex(attribute & indexAttr, attri
     }
 
     if (sourceDataset)
+    {
         transform.setown(createDefaultAssignTransform(record, sourceDataset->queryNormalizedSelector(), indexAttr));
+        //The transform operator must be changed to no_newtransform since it will be an argument to no_newusertable
+        if (transform->getOperator() == no_transform)
+        {
+            HqlExprArray args;
+            unwindChildren(args, transform);
+            OwnedHqlExpr newTransform = createValue(no_newtransform, transform->getType(), args);
+            transform.swap(newTransform);
+        }
+    }
 
     //need to tag record scope in this case so it generates no_activetable as top selector
     OwnedHqlExpr distribution, hash;

+ 5 - 5
ecl/hql/hqlutil.cpp

@@ -4005,13 +4005,13 @@ IHqlExpression * convertRecordToTransform(IHqlExpression * record, bool canOmit)
 }
 
 
-IHqlExpression * createTransformForField(IHqlExpression * field, IHqlExpression * value)
+IHqlExpression * createTransformForField(node_operator op, IHqlExpression * field, IHqlExpression * value)
 {
     OwnedHqlExpr record = createRecord(field);
     OwnedHqlExpr self = getSelf(record);
     OwnedHqlExpr target = createSelectExpr(LINK(self), LINK(field));
     OwnedHqlExpr assign = createAssign(LINK(target), LINK(value));
-    return createValue(no_transform, makeTransformType(record->getType()), assign.getClear());
+    return createValue(op, makeTransformType(record->getType()), assign.getClear());
 }
 
 IHqlExpression * convertScalarToRow(IHqlExpression * value, ITypeInfo * fieldType)
@@ -4025,12 +4025,12 @@ IHqlExpression * convertScalarToRow(IHqlExpression * value, ITypeInfo * fieldTyp
     OwnedHqlExpr attribute;
     if (splitResultValue(dataset, attribute, value))
     {
-        OwnedHqlExpr transform = createTransformForField(field, attribute);
+        OwnedHqlExpr transform = createTransformForField(no_newtransform, field, attribute);
         OwnedHqlExpr ds = createDataset(no_newusertable, LINK(dataset), createComma(LINK(record), LINK(transform)));
         return createRow(no_selectnth, LINK(ds), getSizetConstant(1));
     }
 
-    OwnedHqlExpr transform = createTransformForField(field, value);
+    OwnedHqlExpr transform = createTransformForField(no_transform, field, value);
     return createRow(no_createrow, transform.getClear());
 }
 
@@ -5775,7 +5775,7 @@ bool SplitDatasetAttributeTransformer::split(SharedHqlExpr & dataset, SharedHqlE
     case 2:
         {
             OwnedHqlExpr field = createField(unnamedId, value->getType(), NULL);
-            OwnedHqlExpr transform = createTransformForField(field, value);
+            OwnedHqlExpr transform = createTransformForField(no_transform, field, value);
             OwnedHqlExpr combine = createDatasetF(no_combine, LINK(&newDatasets.item(0)), LINK(&newDatasets.item(1)), LINK(transform), LINK(selSeq), NULL);
             OwnedHqlExpr first = createRowF(no_selectnth, LINK(combine), getSizetConstant(1), createAttribute(noBoundCheckAtom), NULL);
             dataset.setown(createDatasetFromRow(first.getClear()));

+ 1 - 1
ecl/hqlcpp/hqlttcpp.cpp

@@ -9821,7 +9821,7 @@ IHqlExpression * HqlLinkedChildRowTransformer::ensureInputSerialized(IHqlExpress
     //so create a mapping <unserialized> := f(serialized)
     //and then use it to expand references to the unserialized format
     IHqlExpression * selector = dataset->queryNormalizedSelector();
-    OwnedHqlExpr mapTransform = createRecordMappingTransform(no_transform, serializedRecord, selector);
+    OwnedHqlExpr mapTransform = createRecordMappingTransform(no_newtransform, serializedRecord, selector);
     OwnedHqlExpr newDataset = createDatasetF(no_newusertable, LINK(dataset), LINK(serializedRecord), LINK(mapTransform), LINK(selSeq), NULL);
 
     NewProjectMapper2 mapper;