Bläddra i källkod

HPCC-23249 Remote createValueF() and associated cleanup or related functions

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 5 år sedan
förälder
incheckning
e7a228bc27

+ 87 - 265
ecl/hql/hqlexpr.cpp

@@ -3468,7 +3468,7 @@ IHqlExpression * ensureExprType(IHqlExpression * expr, ITypeInfo * type, node_op
                  throwUnexpectedX("Cast to DATASET with no record TYPE specified");   //  cf. HPCC-9847
             OwnedHqlExpr transform = createRecordMappingTransform(no_newtransform, queryOriginalRecord(type), expr->queryNormalizedSelector());
             if (transform)
-                return createDatasetF(no_newusertable, LINK(expr), LINK(queryOriginalRecord(type)), LINK(transform), NULL);
+                return createDataset(no_newusertable, { LINK(expr), LINK(queryOriginalRecord(type)), LINK(transform) });
             //Need to create a project of the dataset - error if can't
             break;
         }
@@ -4932,38 +4932,13 @@ void CHqlRealExpression::onAppendOperand(IHqlExpression & child, unsigned whichO
 #endif
 }
 
-void CHqlRealExpression::appendOperands(IHqlExpression * arg0, ...)
+void CHqlRealExpression::appendSingleOperand(IHqlExpression * arg0)
 {
     if (!arg0)
         return;
 
-    unsigned numArgs = 1;
-    va_list argscount;
-    va_start(argscount, arg0);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(argscount, IHqlExpression *);
-        if (!parm)
-            break;
-        numArgs++;
-    }
-    va_end(argscount);
-
-    operands.ensure(numArgs);
+    operands.ensure(1);
     doAppendOperand(*arg0);
-    va_list args;
-    va_start(args, arg0);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(args, IHqlExpression *);
-        if (!parm)
-            break;
-#ifdef _DEBUG
-        assertex(QUERYINTERFACE(parm, IHqlExpression));
-#endif
-        doAppendOperand(*parm);
-    }
-    va_end(args);
 }
 
 void CHqlRealExpression::setOperands(HqlExprArray & _ownedOperands)
@@ -5167,6 +5142,40 @@ IHqlExpression *CHqlRealExpression::queryAttribute(IAtom * propname) const
 
 //--------------------------------------------------------------------------------------------------------------
 
+void expandOperands(HqlExprArray & args, const std::initializer_list<IHqlExpression *> &operands, bool expandCommas)
+{
+    //Generate an accurate count by iterating and counting expanded commas.  It helps prevent reallocation and minimize wasted memory.
+    unsigned count = 0;
+    for (auto & cur : operands)
+    {
+        //Skip null entries
+        if (cur)
+        {
+            dbgassertex(QUERYINTERFACE(cur, IHqlExpression));
+            if (!expandCommas || (cur->getOperator() != no_comma))
+                count++;
+            else
+                count += unwoundCount(cur, no_comma);
+        }
+    }
+
+    args.ensure(count);
+    for (auto & cur : operands)
+    {
+        //Skip null entries
+        if (cur)
+        {
+            if (!expandCommas || (cur->getOperator() != no_comma))
+                args.append(*cur);
+            else
+            {
+                cur->unwindList(args, no_comma);
+                cur->Release();
+            }
+        }
+    }
+}
+
 CHqlExpressionWithType::CHqlExpressionWithType(node_operator _op, ITypeInfo * _type, HqlExprArray & _ownedOperands)
 : CHqlExpressionWithTables(_op)
 {
@@ -5197,57 +5206,14 @@ CHqlExpression *CHqlExpressionWithType::makeExpression(node_operator _op, ITypeI
     return (CHqlExpression *)e->closeExpr();
 }
 
-CHqlExpression* CHqlExpressionWithType::makeExpression(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands)
+CHqlExpression* CHqlExpressionWithType::makeExpression(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands, bool expandCommas)
 {
+    //Could generate a more accurate count by iterating and counting expanded commas.  Probably not worth it
     HqlExprArray args;
-    args.ensure(operands.size());
-    for (auto & cur : operands)
-    {
-        //Skip null entries
-        if (cur)
-        {
-            dbgassertex(QUERYINTERFACE(cur, IHqlExpression));
-            args.append(*cur);
-        }
-    }
+    expandOperands(args, operands, expandCommas);
     return makeExpression(op, type, args);
 }
 
-CHqlExpression *CHqlExpressionWithType::makeExpression(node_operator _op, ITypeInfo *_type, ...)
-{
-    unsigned numArgs = 0;
-    va_list argscount;
-    va_start(argscount, _type);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(argscount, IHqlExpression *);
-        if (!parm)
-            break;
-        numArgs++;
-    }
-    va_end(argscount);
-
-    HqlExprArray operands;
-    if (numArgs)
-    {
-        va_list args;
-        va_start(args, _type);
-        operands.ensure(numArgs);
-        for (;;)
-        {
-            IHqlExpression *parm = va_arg(args, IHqlExpression *);
-            if (!parm)
-                break;
-#ifdef _DEBUG
-            assertex(QUERYINTERFACE(parm, IHqlExpression));
-#endif
-            operands.append(*parm);
-        }
-        va_end(args);
-    }
-    return makeExpression(_op, _type, operands);
-}
-
 IHqlExpression *CHqlExpressionWithType::clone(HqlExprArray &newkids)
 {
     if ((newkids.ordinality() == 0) && (operands.ordinality() == 0))
@@ -5278,23 +5244,9 @@ IHqlExpression *CHqlExpressionWithType::clone(HqlExprArray &newkids)
 
 //--------------------------------------------------------------------------------------------------------------
 
-CHqlNamedExpression::CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id, ...) : CHqlExpressionWithType(_op, _type)
+CHqlNamedExpression::CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id) : CHqlExpressionWithType(_op, _type)
 {
     id = _id;
-
-    va_list args;
-    va_start(args, _id);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(args, IHqlExpression *);
-        if (!parm)
-            break;
-#ifdef _DEBUG
-        assertex(QUERYINTERFACE(parm, IHqlExpression));
-#endif
-        doAppendOperand(*parm);
-    }
-    va_end(args);
 }
 
 CHqlNamedExpression::CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id, HqlExprArray &_ownedOperands) : CHqlExpressionWithType(_op, _type, _ownedOperands)
@@ -6269,7 +6221,7 @@ ITypeInfo *CHqlConstant::getType()
 CHqlField::CHqlField(IIdAtom * _id, ITypeInfo *_type, IHqlExpression *defvalue)
  : CHqlExpressionWithType(no_field, _type)
 {
-    appendOperands(defvalue, NULL);
+    appendSingleOperand(defvalue);
     assertex(_id);
     id = _id;
     onCreateField();
@@ -7385,7 +7337,7 @@ ITypeInfo * CHqlAnnotation::getType()
 CHqlCachedBoundFunction::CHqlCachedBoundFunction(IHqlExpression *func, bool _forceOutOfLineExpansion)
 : CHqlExpressionWithTables(no_bound_func)
 {
-    appendOperands(LINK(func), NULL);
+    appendSingleOperand(LINK(func));
     if (_forceOutOfLineExpansion)
         addOperand(createConstant(true));
 }
@@ -10126,43 +10078,6 @@ void addForwardDefinition(IHqlScope * scope, IIdAtom * symbolName, IIdAtom * mod
 
 
 //==============================================================================================================
-
-CHqlMultiParentScope::CHqlMultiParentScope(IIdAtom * _name, ...)
- : CHqlScope(no_privatescope, _name, str(_name))
-{
-    va_list args;
-    va_start(args, _name);
-    for (;;)
-    {
-        IHqlScope *parent = va_arg(args, IHqlScope*);
-        if (!parent)
-            break;
-
-        //This should only be used for parser scopes (which are real and non virtual).
-        IHqlExpression * parentExpr = parent->queryExpression();
-        assertex(!parentExpr->hasAttribute(_virtualSeq_Atom));
-        parents.append(*parent);
-    }
-    va_end(args);
-}
-
-IHqlExpression *CHqlMultiParentScope::lookupSymbol(IIdAtom * searchName, unsigned lookupFlags, HqlLookupContext & ctx)
-{
-    IHqlExpression *ret = CHqlScope::lookupSymbol(searchName, lookupFlags, ctx);
-    if (ret)
-        return ret;
-
-    unsigned numChildren = parents.length();
-    for (unsigned i=0; i<numChildren; i++)
-    {
-        ret = ((IHqlScope&)parents.item(i)).lookupSymbol(searchName, lookupFlags, ctx);
-        if (ret)
-            return ret;
-    }
-    return NULL;
-}
-
-//==============================================================================================================
 CHqlContextScope::CHqlContextScope(IHqlScope* _scope) : CHqlScope(no_privatescope) 
 {   
     CHqlContextScope* scope = QUERYINTERFACE(_scope, CHqlContextScope);
@@ -11209,7 +11124,7 @@ extern IHqlExpression *createParameter(IIdAtom * id, unsigned idx, ITypeInfo *ty
 
 extern IHqlExpression *createValue(node_operator op, ITypeInfo *type)
 {
-    return CHqlExpressionWithType::makeExpression(op, type, NULL);
+    return CHqlExpressionWithType::makeExpression(op, type, { });
 }
 extern IHqlExpression *createOpenValue(node_operator op, ITypeInfo *type)
 {
@@ -11254,55 +11169,26 @@ extern IHqlExpression *createOpenNamedValue(node_operator op, ITypeInfo *type, I
                 // MORE - is this right???
             case type_groupedtable:
             case type_table:
-                assertex(!"createDataset should be called instead");
+                throwUnexpectedX("createDataset should be called instead");
             }
+            break;
         }
     }
 #endif
-    return new CHqlNamedExpression(op, type, id, NULL);
+    return new CHqlNamedExpression(op, type, id);
 }
 
 extern IHqlExpression *createValue(node_operator op, ITypeInfo *type, IHqlExpression *p1)
 {
-    return CHqlExpressionWithType::makeExpression(op, type, p1, NULL);
+    return CHqlExpressionWithType::makeExpression(op, type, { p1 });
 }
 extern IHqlExpression *createValue(node_operator op, ITypeInfo *type, IHqlExpression *p1, IHqlExpression *p2)
 {
-    return CHqlExpressionWithType::makeExpression(op, type, p1, p2, NULL);
+    return CHqlExpressionWithType::makeExpression(op, type, { p1, p2 });
 }
 extern IHqlExpression *createValue(node_operator op, ITypeInfo *type, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3)
 {
-    return CHqlExpressionWithType::makeExpression(op, type, p1, p2, p3, NULL);
-}
-
-extern IHqlExpression *createValue(node_operator op, ITypeInfo *type, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3, IHqlExpression *p4)
-{
-    return CHqlExpressionWithType::makeExpression(op, type, p1, p2, p3, p4, NULL);
-}
-
-extern IHqlExpression *createValueF(node_operator op, ITypeInfo *type, ...)
-{
-    HqlExprArray children;
-    va_list args;
-    va_start(args, type);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(args, IHqlExpression *);
-        if (!parm)
-            break;
-
-        dbgassertex(QUERYINTERFACE(parm, IHqlExpression));
-
-        if (parm->getOperator() == no_comma)
-        {
-            parm->unwindList(children, no_comma);
-            parm->Release();
-        }
-        else
-            children.append(*parm);
-    }
-    va_end(args);
-    return CHqlExpressionWithType::makeExpression(op, type, children);
+    return CHqlExpressionWithType::makeExpression(op, type, { p1, p2, p3 });
 }
 
 extern HQL_API IHqlExpression * createValueSafe(node_operator op, ITypeInfo * type, const HqlExprArray & args)
@@ -11325,17 +11211,17 @@ extern HQL_API IHqlExpression * createValueSafe(node_operator op, ITypeInfo * ty
 
 extern IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1)
 {
-    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), p1, NULL);
+    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), { p1 });
 }
 
 extern IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1, IHqlExpression *p2)
 {
-    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), p1, p2, NULL);
+    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), { p1, p2 });
 }
 
 extern IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3)
 {
-    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), p1, p2, p3, NULL);
+    return CHqlExpressionWithType::makeExpression(op, makeBoolType(), { p1, p2, p3 });
 }
 
 extern IHqlExpression *createField(IIdAtom *id, ITypeInfo *type, HqlExprArray & _ownedOperands)
@@ -11491,49 +11377,10 @@ IHqlExpression *createDataset(node_operator op, IHqlExpression *dataset)
 }
 
 
-extern IHqlExpression *createDatasetF(node_operator op, ...)
-{
-    HqlExprArray children;
-    va_list args;
-    va_start(args, op);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(args, IHqlExpression *);
-        if (!parm)
-            break;
-
-        dbgassertex(QUERYINTERFACE(parm, IHqlExpression));
-
-        if (parm->getOperator() == no_comma)
-        {
-            parm->unwindList(children, no_comma);
-            parm->Release();
-        }
-        else
-            children.append(*parm);
-    }
-    va_end(args);
-    return createDataset(op, children);
-}
-
 IHqlExpression *createDataset(node_operator op, const std::initializer_list<IHqlExpression *> &operands)
 {
     HqlExprArray args;
-    for (auto & cur : operands)
-    {
-        //Skip null entries, and expand no_comma
-        if (cur)
-        {
-            dbgassertex(QUERYINTERFACE(cur, IHqlExpression));
-            if (cur->getOperator() == no_comma)
-            {
-                cur->unwindList(args, no_comma);
-                cur->Release();
-            }
-            else
-                args.append(*cur);
-        }
-    }
+    expandOperands(args, operands, true);
     return createDataset(op, args);
 }
 
@@ -11666,6 +11513,13 @@ IHqlExpression *createDictionary(node_operator op, IHqlExpression *dictionary)
     return createDictionary(op, parms);
 }
 
+IHqlExpression *createDictionary(node_operator op, const std::initializer_list<IHqlExpression *> &operands)
+{
+    HqlExprArray args;
+    expandOperands(args, operands, true);
+    return createDictionary(op, args);
+}
+
 IHqlExpression * createAliasOwn(IHqlExpression * expr, IHqlExpression * attr)
 {
     if (expr->getOperator() == no_alias)
@@ -11674,7 +11528,8 @@ IHqlExpression * createAliasOwn(IHqlExpression * expr, IHqlExpression * attr)
         return createDataset(no_alias, expr, attr);
     if (expr->isDatarow())
         return createRow(no_alias, expr, attr);
-    return createValueF(no_alias, expr->getType(), expr, attr, NULL);   // unwinds no_comma
+
+    return createValue(no_alias, expr->getType(), { expr, attr }, true);
 }
 
 
@@ -12669,32 +12524,13 @@ extern IHqlExpression *createRow(node_operator op, IHqlExpression *dataset, IHql
     return createRow(op, args);
 }
 
-extern IHqlExpression *createRowF(node_operator op, ...)
+extern IHqlExpression* createRow(node_operator op, const std::initializer_list<IHqlExpression *> &operands)
 {
-    HqlExprArray children;
-    va_list args;
-    va_start(args, op);
-    for (;;)
-    {
-        IHqlExpression *parm = va_arg(args, IHqlExpression *);
-        if (!parm)
-            break;
-
-        dbgassertex(QUERYINTERFACE(parm, IHqlExpression));
-
-        if (parm->getOperator() == no_comma)
-        {
-            parm->unwindList(children, no_comma);
-            parm->Release();
-        }
-        else
-            children.append(*parm);
-    }
-    va_end(args);
-    return createRow(op, children);
+    HqlExprArray args;
+    expandOperands(args, operands, true);
+    return createRow(op, args);
 }
 
-
 extern IHqlExpression *createRow(node_operator op, HqlExprArray & args)
 {
     ITypeInfo * type = NULL;
@@ -12829,17 +12665,6 @@ extern IHqlExpression *createRow(node_operator op, HqlExprArray & args)
     return CHqlRow::makeRow(op, type, args);
 }
 
-extern IHqlExpression *createList(node_operator op, ITypeInfo *type, IHqlExpression *list)
-{
-    HqlExprArray parms;
-    if (list)
-    {
-        list->unwindList(parms, no_comma);
-        list->Release();
-    }
-    return CHqlExpressionWithType::makeExpression(op, type, parms);
-}
-
 extern IHqlExpression *createBinaryList(node_operator op, HqlExprArray & args)
 {
     unsigned numArgs = args.ordinality();
@@ -13060,9 +12885,9 @@ extern IHqlExpression* createValue(node_operator op, ITypeInfo *type, HqlExprArr
     return CHqlExpressionWithType::makeExpression(op, type, operands);
 }
 
-extern IHqlExpression* createValue(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands)
+extern IHqlExpression* createValue(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands, bool expandCommas)
 {
-    return CHqlExpressionWithType::makeExpression(op, type, operands);
+    return CHqlExpressionWithType::makeExpression(op, type, operands, expandCommas);
 }
 
 extern IHqlExpression* createConstant(int ival) {
@@ -13207,11 +13032,11 @@ extern IHqlExpression * createSelectExpr(IHqlExpression * _lhs, IHqlExpression *
 
     type_t t = rhs->queryType()->getTypeCode();
     if (t == type_table || t == type_groupedtable)
-        return createDataset(no_select, LINK(normalLhs), createComma(rhs, LINK(newAttr)));
+        return createDataset(no_select, { LINK(normalLhs), rhs, LINK(newAttr) });
     if (t == type_dictionary)
         return createDictionary(no_select, LINK(normalLhs), createComma(rhs, LINK(newAttr)));
     if (t == type_row)
-        return createRow(no_select, LINK(normalLhs), createComma(rhs, LINK(newAttr)));
+        return createRow(no_select, { LINK(normalLhs), rhs, LINK(newAttr) });
 
     return CHqlSelectBaseExpression::makeSelectExpression(LINK(normalLhs), rhs, LINK(newAttr));
 }
@@ -13609,9 +13434,22 @@ extern IHqlExpression * createComma(IHqlExpression * expr1, IHqlExpression * exp
 }
 
 
-extern IHqlExpression * createComma(IHqlExpression * expr1, IHqlExpression * expr2, IHqlExpression * expr3, IHqlExpression * expr4)
+extern HQL_API IHqlExpression * createComma(const std::initializer_list<IHqlExpression *> &operands)
 {
-    return createComma(expr1, createComma(expr2, createComma(expr3, expr4)));
+    auto cur = operands.end();
+    const auto last = operands.begin();
+    if (cur == last)
+        return nullptr;
+
+    //MORE: could support (,)(a,b,c,d) as an expression with many children.  I suspect else would need changing.
+    //Walk the list in reverse to create a tree of the form (a,(b,(c,d)))
+    IHqlExpression * result = *--cur;
+    while (cur != last)
+    {
+        --cur;
+        result = createComma(*cur, result);
+    }
+    return result;
 }
 
 
@@ -13959,7 +13797,7 @@ static IHqlExpression * doAttachWorkflowOwn(IHqlExpression * value, IHqlExpressi
         break;
     }
 #endif
-    return createValueF(no_colon, type.getClear(), value, LINK(workflow), NULL);
+    return createValue(no_colon, type.getClear(), { value, LINK(workflow) }, true);
 }
 
 
@@ -15541,22 +15379,6 @@ void unwindAttributes(HqlExprArray & children, const IHqlExpression * expr)
 }
 
 
-void unwindList(HqlExprArray &dst, IHqlExpression * expr, node_operator op)
-{
-    while (expr->getOperator() == op)
-    {
-        unsigned _max = expr->numChildren();
-        if (_max == 0)
-            return;
-        unsigned max = _max-1;
-        for (unsigned i=0; i < max; i++)
-            unwindList(dst, expr->queryChild(i), op);
-        expr = expr->queryChild(max);
-    }
-    dst.append(*LINK(expr));
-}
-
-
 void unwindCopyList(HqlExprCopyArray &dst, IHqlExpression * expr, node_operator op)
 {
     while (expr->getOperator() == op)

+ 5 - 10
ecl/hql/hqlexpr.hpp

@@ -1287,10 +1287,8 @@ extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type);
 extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type, IHqlExpression *p1);
 extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type, IHqlExpression *p1, IHqlExpression *p2);
 extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3);
-extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3, IHqlExpression *p4);
-extern HQL_API IHqlExpression *createValueF(node_operator op, ITypeInfo * type, ...);
 extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo * type, HqlExprArray & args);        //NB: This deletes the array that is passed
-extern HQL_API IHqlExpression* createValue(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands);
+extern HQL_API IHqlExpression *createValue(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands, bool expandCommas=false);
 extern HQL_API IHqlExpression *createValueSafe(node_operator op, ITypeInfo * type, const HqlExprArray & args);
 extern HQL_API IHqlExpression *createValueSafe(node_operator op, ITypeInfo * type, const HqlExprArray & args, unsigned from, unsigned max);
 
@@ -1310,9 +1308,7 @@ extern HQL_API IHqlExpression *createEnumType(ITypeInfo * _type, IHqlScope *_sco
 extern HQL_API IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1);
 extern HQL_API IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1, IHqlExpression *p2);
 extern HQL_API IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3);
-extern HQL_API IHqlExpression *createBoolExpr(node_operator op, IHqlExpression *p1, IHqlExpression *p2, IHqlExpression *p3, IHqlExpression *p4);
 
-extern HQL_API IHqlExpression *createList(node_operator op, ITypeInfo *type, IHqlExpression *p1);
 extern HQL_API IHqlExpression *createBinaryList(node_operator op, HqlExprArray & args);
 extern HQL_API IHqlExpression *createLeftBinaryList(node_operator op, HqlExprArray & args);
 
@@ -1329,16 +1325,16 @@ extern HQL_API IHqlExpression *createUtf8Constant(const char *constant);
 extern HQL_API IHqlExpression *createBlankString();
 extern HQL_API IHqlExpression *createDataset(node_operator op, IHqlExpression *dataset);
 extern HQL_API IHqlExpression *createDataset(node_operator op, IHqlExpression *dataset, IHqlExpression *elist);
-extern HQL_API IHqlExpression *createDataset(node_operator op, HqlExprArray & parms);       // inScope should only be set internally.
-extern HQL_API IHqlExpression *createDatasetF(node_operator op, ...);
+extern HQL_API IHqlExpression *createDataset(node_operator op, HqlExprArray & parms);
 extern HQL_API IHqlExpression *createDataset(node_operator op, const std::initializer_list<IHqlExpression *> &operands);
 extern HQL_API IHqlExpression *createDictionary(node_operator op, IHqlExpression *initializer, IHqlExpression *recordDef);
 extern HQL_API IHqlExpression *createDictionary(node_operator op, IHqlExpression *dictionary);
 extern HQL_API IHqlExpression *createDictionary(node_operator op, HqlExprArray & parms);
+extern HQL_API IHqlExpression *createDictionary(node_operator op, const std::initializer_list<IHqlExpression *> &operands);
 extern HQL_API IHqlExpression *createNewDataset(IHqlExpression *name, IHqlExpression *recorddef, IHqlExpression *mode, IHqlExpression *parent, IHqlExpression *joinCondition, IHqlExpression * options);
 extern HQL_API IHqlExpression *createRow(node_operator op, IHqlExpression *Dataset, IHqlExpression *element = NULL);
 extern HQL_API IHqlExpression *createRow(node_operator op, HqlExprArray & args);
-extern HQL_API IHqlExpression *createRowF(node_operator op, ...);
+extern HQL_API IHqlExpression *createRow(node_operator op, const std::initializer_list<IHqlExpression *> &operands);
 extern HQL_API IHqlExpression *createRecord();
 extern HQL_API IHqlExpression *createRecord(const HqlExprArray & fields);
 extern HQL_API IHqlExpression *createExternalReference(IIdAtom * name, ITypeInfo *_type, IHqlExpression *props);
@@ -1391,7 +1387,7 @@ extern HQL_API IHqlExpression * createActionList(const HqlExprArray & actions, u
 extern HQL_API IHqlExpression * createActionList(node_operator op, const HqlExprArray & actions, unsigned from, unsigned to);
 extern HQL_API IHqlExpression * createComma(IHqlExpression * expr1, IHqlExpression * expr2);
 extern HQL_API IHqlExpression * createComma(IHqlExpression * expr1, IHqlExpression * expr2, IHqlExpression * expr3);
-extern HQL_API IHqlExpression * createComma(IHqlExpression * expr1, IHqlExpression * expr2, IHqlExpression * expr3, IHqlExpression * expr4);
+extern HQL_API IHqlExpression * createComma(const std::initializer_list<IHqlExpression *> &operands);
 extern HQL_API IHqlExpression * createComma(const HqlExprArray & exprs);
 extern HQL_API IHqlExpression * createBalanced(node_operator op, ITypeInfo * type, const HqlExprArray & exprs);
 extern HQL_API IHqlExpression * createBalanced(node_operator op, ITypeInfo * type, const HqlExprArray & exprs, unsigned first, unsigned last);
@@ -1575,7 +1571,6 @@ extern HQL_API void unwindChildren(HqlExprArray & children, const IHqlExpression
 extern HQL_API void unwindChildren(HqlExprCopyArray & children, const IHqlExpression * expr, unsigned first=0);
 extern HQL_API void unwindRealChildren(HqlExprArray & children, const IHqlExpression * expr, unsigned first);
 extern HQL_API void unwindAttributes(HqlExprArray & children, const IHqlExpression * expr);
-extern HQL_API void unwindList(HqlExprArray &dst, IHqlExpression * expr, node_operator op);
 extern HQL_API void unwindCopyList(HqlExprCopyArray &dst, IHqlExpression * expr, node_operator op);
 extern HQL_API void unwindCommaCompound(HqlExprArray & target, IHqlExpression * expr);
 extern HQL_API void unwindRecordAsSelects(HqlExprArray & children, IHqlExpression * record, IHqlExpression * ds, unsigned max = (unsigned)-1);

+ 3 - 18
ecl/hql/hqlexpr.ipp

@@ -361,7 +361,7 @@ protected:
     inline bool pure() const { return (infoFlags & HEFimpure) == 0; }
     virtual unsigned getCachedEclCRC() override;
 
-    void appendOperands(IHqlExpression * arg0, ...);
+    void appendSingleOperand(IHqlExpression * arg0);
     void setOperands(HqlExprArray & ownedOperands);
     void onAppendOperand(IHqlExpression & child, unsigned whichOperand);
     inline void doAppendOperand(IHqlExpression & child)
@@ -421,8 +421,7 @@ class HQL_API CHqlExpressionWithType : public CHqlExpressionWithTables
     friend HQL_API IHqlExpression *createOpenValue(node_operator op, ITypeInfo *type);
 public:
     static CHqlExpression *makeExpression(node_operator op, ITypeInfo *type, HqlExprArray &operands);
-    static CHqlExpression *makeExpression(node_operator op, ITypeInfo *type, ...);
-    static CHqlExpression *makeExpression(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands);
+    static CHqlExpression *makeExpression(node_operator op, ITypeInfo *type, const std::initializer_list<IHqlExpression *> &operands, bool expandCommas = false);
 
     virtual ITypeInfo *queryType() const override;
     virtual ITypeInfo *getType() override;
@@ -447,7 +446,7 @@ protected:
     IIdAtom * id;
 
 protected:
-    CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id, ...);
+    CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id);
     CHqlNamedExpression(node_operator _op, ITypeInfo *_type, IIdAtom * _id, HqlExprArray & _ownedOperands);
 
     virtual void sethash() override;
@@ -1398,20 +1397,6 @@ protected:
     bool mergedAll;
 };
 
-//Used in the parser to allow symbols to be looked up in a list of multiple independent scopes.
-class CHqlMultiParentScope : public CHqlScope
-{
-protected:
-    ICopyArray parents;
-
-public:
-    CHqlMultiParentScope(IIdAtom *, ...);
-
-    virtual IHqlExpression *lookupSymbol(IIdAtom * searchName, unsigned lookupFlags, HqlLookupContext & ctx) override;
-    virtual IHqlScope * queryConcreteScope() override { return this; }
-    virtual bool allBasesFullyBound() const override { return true; }
-};
-
 //MORE: I'm not 100% sure why this is different from a CLocalScope... it should be merged
 class CHqlContextScope : public CHqlScope
 {

+ 96 - 96
ecl/hql/hqlgram.y

@@ -1623,11 +1623,11 @@ failclause
 failure
     : FAILURE '(' action commaIndependentOptions')'
                         {
-                            $$.setExpr(createValueF(no_failure, makeNullType(), $3.getExpr(), $4.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_failure, makeNullType(), { $3.getExpr(), $4.getExpr() }, true), $1);
                         }
     | SUCCESS '(' action commaIndependentOptions ')'
                         {
-                            $$.setExpr(createValueF(no_success, makeNullType(), $3.getExpr(), $4.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_success, makeNullType(), { $3.getExpr(), $4.getExpr() }, true), $1);
                         }
     | RECOVERY '(' action ')'
                         {
@@ -1657,23 +1657,23 @@ failure
     | PERSIST '(' expression ')'
                         {
                             parser->normalizeExpression($3, type_string, true);
-                            $$.setExpr(createValueF(no_persist, makeVoidType(), $3.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_persist, makeVoidType(), { $3.getExpr() }), $1);
                         }
     | PERSIST '(' expression ',' persistOpts ')'
                         {
                             parser->normalizeExpression($3, type_string, true);
-                            $$.setExpr(createValueF(no_persist, makeVoidType(), $3.getExpr(), $5.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_persist, makeVoidType(), { $3.getExpr(), $5.getExpr() }, true), $1);
                         }
     | PERSIST '(' expression ',' expression optPersistOpts ')'
                         {
                             parser->normalizeExpression($3, type_string, true);
                             parser->normalizeExpression($5, type_string, true);
-                            $$.setExpr(createValueF(no_persist, makeVoidType(), $3.getExpr(), $5.getExpr(), $6.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_persist, makeVoidType(), { $3.getExpr(), $5.getExpr(), $6.getExpr() }, true), $1);
                         }
     | CRITICAL '(' expression commaIndependentOptions ')'
                         {
                             parser->normalizeExpression($3, type_string, true);
-                            $$.setExpr(createValueF(no_critical, makeVoidType(), $3.getExpr(), $4.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_critical, makeVoidType(), { $3.getExpr(), $4.getExpr() }, true), $1);
                         }
     | STORED '(' startStoredAttrs expression ',' fewMany optStoredFieldFormat ')'
                         {
@@ -1709,11 +1709,11 @@ failure
                         }
     | INDEPENDENT '(' independentOptions ')'
                         {
-                            $$.setExpr(createValueF(no_independent, makeNullType(), $3.getExpr(), nullptr), $1);
+                            $$.setExpr(createValue(no_independent, makeNullType(), { $3.getExpr() }, true), $1);
                         }
     | INDEPENDENT '(' expression commaIndependentOptions ')'
                         {
-                            $$.setExpr(createValueF(no_independent, makeNullType(), $3.getExpr(), $4.getExpr(), nullptr), $1);
+                            $$.setExpr(createValue(no_independent, makeNullType(), { $3.getExpr(), $4.getExpr() }, true), $1);
                         }
     | DEFINE '(' stringConstExpr ')'
                         {
@@ -2433,7 +2433,7 @@ actionStmt
                             HqlExprArray options;
                             $7.unwindCommaList(options);
 
-                            OwnedHqlExpr select = createDatasetF(no_selectfields, dataset, record, NULL);
+                            OwnedHqlExpr select = createDataset(no_selectfields, { dataset, record } );
                             IHqlExpression * filename = options.ordinality() ? &options.item(0) : NULL;
                             if (!filename || filename->isAttribute())
                             {
@@ -2485,7 +2485,7 @@ actionStmt
                                 OwnedHqlExpr mapped = replaceSelector(arg, dataset, queryActiveTableSelector());
                                 if (mapped != arg)
                                     parser->reportError(ERR_ROWPIPE_AND_PROJECT, $8, "OUTPUT to PIPE with a projecting record doesn't currently work when the command is dependant on the current row");
-                                args.append(*createDatasetF(no_selectfields, dataset, LINK(record), NULL)); //createUniqueId(), NULL));
+                                args.append(*createDataset(no_selectfields, { dataset, LINK(record) }));
                             }
                             pipe->unwindList(args, no_comma);
                             $9.unwindCommaList(args);
@@ -2505,7 +2505,7 @@ actionStmt
                         {
                             IHqlExpression *dataset = $3.getExpr();
                             IHqlExpression *record = createValue(no_null, makeNullType());
-                            OwnedHqlExpr select = createDatasetF(no_selectfields, dataset, record, NULL); //createUniqueId(), NULL);
+                            OwnedHqlExpr select = createDataset(no_selectfields, { dataset, record });
                             OwnedHqlExpr flags = $4.getExpr();
 
                             if (queryAttributeInList(extendAtom, flags) && !queryAttributeInList(namedAtom, flags))
@@ -2701,46 +2701,46 @@ actionStmt
                             parser->normalizeExpression($3, type_stringorunicode, false);
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->checkSoapRecord($7);
-                            $$.setExpr(createValueF(no_soapcall, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_soapcall, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr() }, true), $1);
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' transform ')'
                         {
                             parser->normalizeExpression($3, type_stringorunicode, false);
                             parser->normalizeExpression($5, type_stringorunicode, false);
-                            $$.setExpr(createValue(no_newsoapcall, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr()), $1);
+                            $$.setExpr(createValue(no_newsoapcall, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr() }, true), $1);
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' transform ',' soapFlags ')'
                         {
                             parser->normalizeExpression($3, type_stringorunicode, false);
                             parser->normalizeExpression($5, type_stringorunicode, false);
-                            $$.setExpr(createValueF(no_newsoapcall, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_newsoapcall, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr() }, true), $1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ')' endTopLeftFilter endSelectorSequence
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->normalizeExpression($7, type_stringorunicode, false);
                             parser->checkSoapRecord($9);
-                            $$.setExpr(createValueF(no_soapaction_ds, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $12.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_soapaction_ds, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $12.getExpr() }, true), $1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ',' soapFlags ')' endTopLeftFilter endSelectorSequence
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->normalizeExpression($7, type_stringorunicode, false);
                             parser->checkSoapRecord($9);
-                            $$.setExpr(createValueF(no_soapaction_ds, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $14.getExpr(), NULL), $1);
+                            $$.setExpr(createValue(no_soapaction_ds, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $14.getExpr() }, true), $1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ',' transform ')' endTopLeftFilter endSelectorSequence
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->normalizeExpression($7, type_stringorunicode, false);
-                            $$.setExpr(createValueF(no_newsoapaction_ds, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $14.getExpr(), NULL));
+                            $$.setExpr(createValue(no_newsoapaction_ds, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $14.getExpr() }, true));
                             $$.setPosition($1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ',' transform ',' soapFlags ')' endTopLeftFilter endSelectorSequence
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->normalizeExpression($7, type_stringorunicode, false);
-                            $$.setExpr(createValueF(no_newsoapaction_ds, makeVoidType(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $13.getExpr(), $16.getExpr(), NULL));
+                            $$.setExpr(createValue(no_newsoapaction_ds, makeVoidType(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $13.getExpr(), $16.getExpr() }, true));
                             $$.setPosition($1);
                         }
     | KEYDIFF '(' dataSet ',' dataSet ',' expression keyDiffFlags ')'
@@ -2831,7 +2831,7 @@ actionStmt
                                 $$.setExpr($3.getExpr());
                             }
                             else
-                                $$.setExpr(createValueF(no_cluster, makeVoidType(), $3.getExpr(), $5.getExpr(), NULL));
+                                $$.setExpr(createValue(no_cluster, makeVoidType(), { $3.getExpr(), $5.getExpr() }));
                             $$.setPosition($1);
                         }
     | OUTPUT '(' abstractModule ')'
@@ -2904,7 +2904,7 @@ failAction
                         {
                             OwnedHqlExpr options = $6.getExpr();
                             if (options)
-                                $$.setExpr(createValueF(no_executewhen, makeVoidType(), $3.getExpr(), $5.getExpr(), options.getClear(), NULL), $1);
+                                $$.setExpr(createValue(no_executewhen, makeVoidType(), { $3.getExpr(), $5.getExpr(), options.getClear() }, true), $1);
                             else
                                 $$.setExpr(createCompound($5.getExpr(), $3.getExpr()), $1);
                         }
@@ -5310,7 +5310,7 @@ query
                                         break;
                                     }
 #endif
-                                    $$.setExpr(createValueF(no_colon, type.getClear(), expr, failure, NULL));
+                                    $$.setExpr(createValue(no_colon, type.getClear(), { expr, failure }, true));
                                 }
                             }
                             else
@@ -5327,7 +5327,7 @@ query
                             expr = parser->attachMetaAttributes(expr, meta);
 
                             IHqlExpression *record = createValue(no_null, makeNullType());
-                            OwnedHqlExpr select = createDatasetF(no_selectfields, expr, record, NULL);
+                            OwnedHqlExpr select = createDataset(no_selectfields, { expr, record });
                             HqlExprArray args;
                             args.append(*select.getClear());
                             IHqlExpression * output = createValue(no_output, makeVoidType(), args);
@@ -5964,7 +5964,7 @@ primexpr1
                         {   $$.inherit($2); }
     | COUNT '(' startTopFilter aggregateFlags ')' endTopFilter
                         {
-                            $$.setExpr(createValueF(no_count, LINK(parser->defaultIntegralType), $3.getExpr(), $4.getExpr(), NULL));
+                            $$.setExpr(createValue(no_count, LINK(parser->defaultIntegralType), { $3.getExpr(), $4.getExpr() }, true));
                         }
     | COUNT '(' GROUP optExtraFilter ')'
                         {
@@ -5996,7 +5996,7 @@ primexpr1
                         }
     | EXISTS '(' dataSet aggregateFlags ')'
                         {
-                            $$.setExpr(createValueF(no_exists, makeBoolType(), $3.getExpr(), $4.getExpr(), NULL));
+                            $$.setExpr(createValue(no_exists, makeBoolType(), { $3.getExpr(), $4.getExpr() }, true));
                             $$.setPosition($1);
                         }
     | EXISTS '(' dictionary ')'
@@ -6158,7 +6158,7 @@ primexpr1
                         {
                             parser->normalizeExpression($3);
                             IHqlExpression * value = $3.getExpr();
-                            $$.setExpr(createValueF(no_globalscope, value->getType(), value, $4.getExpr(), NULL));
+                            $$.setExpr(createValue(no_globalscope, value->getType(), { value, $4.getExpr() }, true));
                             $$.setPosition($1);
                         }
     | TOK_LOG '(' expression ')'
@@ -6315,7 +6315,7 @@ primexpr1
                                 subType.setown(makeStringType(UNKNOWN_LENGTH));
                             }
                             parser->normalizeExpression($7, type_int, false);
-                            $$.setExpr(createValue(no_regex_find, subType.getLink(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr()));
+                            $$.setExpr(createValue(no_regex_find, subType.getLink(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr() }));
                         }
     | REGEXFINDSET '(' expression ',' expression regexOpt ')'
                         {
@@ -6350,7 +6350,7 @@ primexpr1
                                 parser->normalizeExpression($7, type_string, false);
                                 retType.setown(makeStringType(UNKNOWN_LENGTH));
                             }
-                            $$.setExpr(createValue(no_regex_replace, retType.getLink(), $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr()));
+                            $$.setExpr(createValue(no_regex_replace, retType.getLink(), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr() }));
                         }
     | ASSTRING '(' expression ')'
                         {
@@ -6382,7 +6382,7 @@ primexpr1
                         {
                             parser->normalizeExpression($5);
                             IHqlExpression *e5 = $5.getExpr();
-                            $$.setExpr(createValueF(no_max, e5->getType(), $3.getExpr(), e5, $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_max, e5->getType(), { $3.getExpr(), e5, $6.getExpr() }, true));
                         }
     | MAX '(' GROUP ',' expression ')'
                         {
@@ -6394,7 +6394,7 @@ primexpr1
                         {
                             parser->normalizeExpression($5);
                             IHqlExpression *e5 = $5.getExpr();
-                            $$.setExpr(createValueF(no_min, e5->getType(), $3.getExpr(), e5, $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_min, e5->getType(), { $3.getExpr(), e5, $6.getExpr() }, true));
                         }
     | MIN '(' GROUP ',' expression ')'
                         {
@@ -6415,7 +6415,7 @@ primexpr1
                             Owned<ITypeInfo> temp = parser->checkPromoteNumeric($5, true);
                             OwnedHqlExpr value = $5.getExpr();
                             Owned<ITypeInfo> type = getSumAggType(value);
-                            $$.setExpr(createValueF(no_sum, LINK(type), $3.getExpr(), ensureExprType(value, type), $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_sum, LINK(type), { $3.getExpr(), ensureExprType(value, type), $6.getExpr() }, true));
                         }
     | SUM '(' GROUP ',' expression optExtraFilter ')'
                         {
@@ -6423,12 +6423,12 @@ primexpr1
                             Owned<ITypeInfo> temp = parser->checkPromoteNumeric($5, true);
                             OwnedHqlExpr value = $5.getExpr();
                             Owned<ITypeInfo> type = getSumAggType(value);
-                            $$.setExpr(createValueF(no_sumgroup, LINK(type), ensureExprType(value, type), $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_sumgroup, LINK(type), { ensureExprType(value, type), $6.getExpr() }, true));
                         }
     | AVE '(' startTopFilter ',' expression aggregateFlags ')' endTopFilter
                         {
                             parser->normalizeExpression($5, type_numeric, false);
-                            $$.setExpr(createValueF(no_ave, makeRealType(8), $3.getExpr(), $5.getExpr(), $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_ave, makeRealType(8), { $3.getExpr(), $5.getExpr(), $6.getExpr() }, true));
                         }
     | AVE '(' GROUP ',' expression optExtraFilter')'
                         {
@@ -6438,7 +6438,7 @@ primexpr1
     | VARIANCE '(' startTopFilter ',' expression aggregateFlags ')' endTopFilter
                         {
                             parser->normalizeExpression($5, type_numeric, false);
-                            $$.setExpr(createValueF(no_variance, makeRealType(8), $3.getExpr(), $5.getExpr(), $6.getExpr(), NULL));
+                            $$.setExpr(createValue(no_variance, makeRealType(8), { $3.getExpr(), $5.getExpr(), $6.getExpr() }, true));
                         }
     | VARIANCE '(' GROUP ',' expression optExtraFilter')'
                         {
@@ -6449,7 +6449,7 @@ primexpr1
                         {
                             parser->normalizeExpression($5, type_numeric, false);
                             parser->normalizeExpression($7, type_numeric, false);
-                            $$.setExpr(createValueF(no_covariance, makeRealType(8), $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr(), NULL));
+                            $$.setExpr(createValue(no_covariance, makeRealType(8), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr() }, true));
                         }
     | COVARIANCE '(' GROUP ',' expression ',' expression optExtraFilter')'
                         {
@@ -6461,7 +6461,7 @@ primexpr1
                         {
                             parser->normalizeExpression($5, type_numeric, false);
                             parser->normalizeExpression($7, type_numeric, false);
-                            $$.setExpr(createValueF(no_correlation, makeRealType(8), $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr(), NULL));
+                            $$.setExpr(createValue(no_correlation, makeRealType(8), { $3.getExpr(), $5.getExpr(), $7.getExpr(), $8.getExpr() }, true));
                         }
     | CORRELATION '(' GROUP ',' expression ',' expression optExtraFilter')'
                         {
@@ -6471,11 +6471,11 @@ primexpr1
                         }
     | WHICH '(' optCondList ')'
                         {
-                            $$.setExpr(createList(no_which, LINK(parser->uint4Type), $3.getExpr()), $1);
+                            $$.setExpr(createValue(no_which, LINK(parser->uint4Type), { $3.getExpr() }, true), $1);
                         }
     | REJECTED '(' optCondList ')'
                         {
-                            $$.setExpr(createList(no_rejected, LINK(parser->uint4Type), $3.getExpr()), $1);
+                            $$.setExpr(createValue(no_rejected, LINK(parser->uint4Type), { $3.getExpr() }, true), $1);
                         }
     | SIZEOF '(' sizeof_type_target optMaxMin ')'
                         {
@@ -6830,7 +6830,7 @@ primexpr1
                             OwnedHqlExpr options = $6.getExpr();
                             OwnedHqlExpr expr = $3.getExpr();
                             if (options)
-                                $$.setExpr(createValueF(no_executewhen, expr->getType(), LINK(expr), $5.getExpr(), options.getClear(), NULL), $1);
+                                $$.setExpr(createValue(no_executewhen, expr->getType(), { LINK(expr), $5.getExpr(), options.getClear() }, true), $1);
                             else
                                 $$.setExpr(createCompound($5.getExpr(), expr.getClear()), $1);
                         }
@@ -6939,7 +6939,7 @@ primexpr1
                             parser->normalizeExpression($5, type_unicode, false);
                             ::Release(parser->checkPromoteType($3, $5));
                             IAtom * locale = parser->ensureCommonLocale($3, $5);
-                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), $3.getExpr(), $5.getExpr(), createConstant(str(locale)), createConstant(3)));
+                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), { $3.getExpr(), $5.getExpr(), createConstant(str(locale)), createConstant(3) }));
                         }
     | UNICODEORDER '(' expression ',' expression ',' expression ')'
                         {
@@ -6951,7 +6951,7 @@ primexpr1
                             Owned<IHqlExpression> lexpr = $7.getExpr();
                             Owned<ITypeInfo> ltype = lexpr->getType();
                             Owned<IHqlExpression> locale = (ltype->getTypeCode() == type_varstring) ? lexpr.getLink() : createValue(no_implicitcast, makeVarStringType(ltype->getStringLen()), lexpr.getLink());
-                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), $3.getExpr(), $5.getExpr(), locale.getLink(), createConstant(3)));
+                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), { $3.getExpr(), $5.getExpr(), locale.getLink(), createConstant(3) }));
                         }
     | UNICODEORDER '(' expression ',' expression ',' ',' expression ')'
                         {
@@ -6960,7 +6960,7 @@ primexpr1
                             IAtom * locale = parser->ensureCommonLocale($3, $5);
                             parser->normalizeExpression($8, type_int, false);
                             ::Release(parser->checkPromoteType($3, $5));
-                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), $3.getExpr(), $5.getExpr(), createConstant(str(locale)), $8.getExpr()));
+                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), { $3.getExpr(), $5.getExpr(), createConstant(str(locale)), $8.getExpr() }));
                         }
     | UNICODEORDER '(' expression ',' expression ',' expression ',' expression ')'
                         {
@@ -6973,7 +6973,7 @@ primexpr1
                             Owned<IHqlExpression> lexpr = $7.getExpr();
                             Owned<ITypeInfo> ltype = lexpr->getType();
                             Owned<IHqlExpression> locale = (ltype->getTypeCode() == type_varstring) ? lexpr.getLink() : createValue(no_implicitcast, makeVarStringType(ltype->getStringLen()), lexpr.getLink());
-                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), $3.getExpr(), $5.getExpr(), locale.getLink(), $9.getExpr()));
+                            $$.setExpr(createValue(no_unicodeorder, makeIntType(4, true), { $3.getExpr(), $5.getExpr(), locale.getLink(), $9.getExpr() }));
                          }
     | LIKELY '(' booleanExpr ')'
                         {
@@ -7006,11 +7006,11 @@ primexpr1
                             $$.setExpr(fields.getClear(), $1);
                         }
     | '[' ']'           {
-                            $$.setExpr(createList(no_list, makeSetType(NULL), NULL));
+                            $$.setExpr(createValue(no_list, makeSetType(NULL)));
                             $$.setPosition($1);
                         }
     | ALL               {
-                            $$.setExpr(createValue(no_all, makeSetType(NULL), NULL));
+                            $$.setExpr(createValue(no_all, makeSetType(NULL)));
                             $$.setPosition($1);
                         }
     | SET '(' startTopFilter ',' expression ')' endTopFilter
@@ -7613,14 +7613,14 @@ simpleDataRow
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
                             parser->normalizeExpression($7);
-                            IHqlExpression * ds = createDataset(no_httpcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr()));
+                            IHqlExpression * ds = createDataset(no_httpcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr() });
                             $$.setExpr(createRow(no_selectnth, ds, createConstantOne()));
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' recordDef ')'
                         {
                             parser->normalizeExpression($3);
                             parser->checkSoapRecord($7);
-                            IHqlExpression * ds = createDataset(no_soapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr()));
+                            IHqlExpression * ds = createDataset(no_soapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr() });
                             $$.setExpr(createRow(no_selectnth, ds, createConstantOne()));
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' recordDef ',' soapFlags ')'
@@ -7628,7 +7628,7 @@ simpleDataRow
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
                             parser->checkSoapRecord($7);
-                            IHqlExpression * ds = createDataset(no_soapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr()));
+                            IHqlExpression * ds = createDataset(no_soapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr() });
                             $$.setExpr(createRow(no_selectnth, ds, createConstantOne()));
                             parser->checkOnFailRecord($$.queryExpr(), $1);
                         }
@@ -7636,7 +7636,7 @@ simpleDataRow
                         {
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
-                            IHqlExpression * ds = createDataset(no_newsoapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr()));
+                            IHqlExpression * ds = createDataset(no_newsoapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr() });
                             $$.setExpr(createRow(no_selectnth, ds, createConstantOne()));
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' transform ',' recordDef ',' soapFlags ')'
@@ -8111,7 +8111,7 @@ dataSet
 
                             OwnedHqlExpr transform = parser->createDefaultAssignTransform(left->queryRecord(), leftSelect, $1);
                             OwnedHqlExpr cond = createBoolExpr(no_eq, LINK(leftSelect), LINK(rightSelect));
-                            $$.setExpr(createDatasetF(no_join, LINK(left), LINK(right), cond.getClear(), transform.getClear(), LINK(seq), createAttribute(leftonlyAtom), NULL), $1);
+                            $$.setExpr(createDataset(no_join, { LINK(left), LINK(right), cond.getClear(), transform.getClear(), LINK(seq), createAttribute(leftonlyAtom) }), $1);
                         }
 /*
   The following would implement (X - Y) + (Y - X), but it would need a new operator since ^ is overloaded for the scope resolution
@@ -8210,7 +8210,7 @@ simpleDataSet
                                 OwnedHqlExpr seq = parser->createActiveSelectorSequence(ds, NULL);
                                 OwnedHqlExpr left = createSelector(no_left, ds, seq);
                                 OwnedHqlExpr transform = parser->createDefaultAssignTransform(ebcdicRecord, left, $1);
-                                $$.setExpr(createDatasetF(no_transformebcdic, ds, transform.getClear(), LINK(seq), NULL));
+                                $$.setExpr(createDataset(no_transformebcdic, { ds, transform.getClear(), LINK(seq) }));
                             }
                             else
                                 $$.setExpr(ds);
@@ -8225,7 +8225,7 @@ simpleDataSet
                                 OwnedHqlExpr seq = parser->createActiveSelectorSequence(ds, NULL);
                                 OwnedHqlExpr left = createSelector(no_left, ds, seq);
                                 OwnedHqlExpr transform = parser->createDefaultAssignTransform(asciiRecord, left, $1);
-                                $$.setExpr(createDatasetF(no_transformascii, ds, transform.getClear(), LINK(seq), NULL));
+                                $$.setExpr(createDataset(no_transformascii, { ds, transform.getClear(), LINK(seq) }));
                             }
                             else
                                 $$.setExpr(ds);
@@ -8317,7 +8317,7 @@ simpleDataSet
                             HqlExprArray args;
                             unwindChildren(args, fields);
                             OwnedHqlExpr value = createValue(no_sortpartition, LINK(parser->defaultIntegralType), args);
-                            $$.setExpr(createDatasetF(no_distribute, $3.getExpr(), value.getClear(), $11.getExpr(), NULL));
+                            $$.setExpr(createDataset(no_distribute, { $3.getExpr(), value.getClear(), $11.getExpr() }));
                             $$.setPosition($1);
                         }
     | DISTRIBUTE '(' startTopFilter startDistributeAttrs ',' startRightDistributeSeqFilter endTopFilter ',' expression optKeyedDistributeAttrs ')' endSelectorSequence
@@ -8331,7 +8331,7 @@ simpleDataSet
                             if (!isKey(right))
                                 parser->reportError(ERR_EXPECTED_INDEX,$5,"Expected an index as the second parameter");
 
-                            IHqlExpression * ds = createDataset(no_keyeddistribute, left, createComma(right, cond, LINK(attr), $12.getExpr()));
+                            IHqlExpression * ds = createDataset(no_keyeddistribute, { left, right, cond, LINK(attr), $12.getExpr() });
 
                             JoinSortInfo joinInfo(cond, NULL, NULL, NULL, NULL);
                             joinInfo.findJoinSortOrders(false);
@@ -8355,7 +8355,7 @@ simpleDataSet
 
                             IHqlExpression * cond = parser->createDistributeCond(left, right, $6, $10);
 
-                            IHqlExpression * ds = createDataset(no_keyeddistribute, left, createComma(right, cond, $8.getExpr(), $10.getExpr()));
+                            IHqlExpression * ds = createDataset(no_keyeddistribute, { left, right, cond, $8.getExpr(), $10.getExpr() });
                             //Should check that all index fields are accounted for...
 
                             $$.setExpr(ds);
@@ -8441,7 +8441,7 @@ simpleDataSet
                             OwnedHqlExpr flags;
                             parser->expandSortedAsList(sortItems);
                             IHqlExpression * order = parser->processSortList($10, no_mergejoin, ds, sortItems, NULL, &flags);
-                            IHqlExpression * join = createDataset(no_mergejoin, ds, createComma(cond, order, flags.getClear(), createComma($8.getExpr(), $13.getExpr())));
+                            IHqlExpression * join = createDataset(no_mergejoin, { ds, cond, order, flags.getClear(), $8.getExpr(), $13.getExpr() });
                             $$.setExpr(join);
                             $$.setPosition($1);
                         }
@@ -8459,7 +8459,7 @@ simpleDataSet
                             $10.unwindCommaList(sortItems);
                             parser->expandSortedAsList(sortItems);
                             IHqlExpression * order = parser->processSortList($10, no_nwayjoin, ds, sortItems, NULL, &flags);
-                            IHqlExpression * join = createDataset(no_nwayjoin, ds, createComma(cond, tform, order, createComma(flags.getClear(), $12.getExpr(), $14.getExpr())));
+                            IHqlExpression * join = createDataset(no_nwayjoin, { ds, cond, tform, order, flags.getClear(), $12.getExpr(), $14.getExpr() });
                             $$.setExpr(join);
                             $$.setPosition($1);
                         }
@@ -8488,7 +8488,7 @@ simpleDataSet
                                 attr = createComma(attr, createAttribute(_countProject_Atom, counter));
                             parser->ensureTransformTypeMatch($8, left);
                             parser->ensureTransformTypeMatch($10, right);
-                            $$.setExpr(createDataset(no_process, left, createComma(right, $8.getExpr(), $10.getExpr(), createComma(attr, $14.getExpr()))));
+                            $$.setExpr(createDataset(no_process, { left, right, $8.getExpr(), $10.getExpr(), attr, $14.getExpr() }));
                             $$.setPosition($1);
                         }
     | ROLLUP '(' startTopLeftRightSeqFilter ',' expression ',' transform optCommonAttrs ')' endTopLeftRightFilter endSelectorSequence
@@ -8498,7 +8498,7 @@ simpleDataSet
 
                             OwnedHqlExpr tr = $7.getExpr();
                             IHqlExpression *attr = $8.getExpr();
-                            $$.setExpr(createDataset(no_rollup, $3.getExpr(), createComma($5.getExpr(), tr.getClear(), attr, $11.getExpr())));
+                            $$.setExpr(createDataset(no_rollup, { $3.getExpr(), $5.getExpr(), tr.getClear(), attr, $11.getExpr() }));
                             parser->checkDistribution($3, $$.queryExpr(), false);
                             $$.setPosition($1);
                         }
@@ -8534,7 +8534,7 @@ simpleDataSet
 
                             if (!recordTypesMatch(ds, tr))
                                 parser->reportError(ERR_TRANSFORM_TYPE_MISMATCH,$5,"Type returned from transform must match the source dataset type");
-                            $$.setExpr(createDataset(no_rollup, ds, createComma(cond, tr, attr, LINK(seq))));
+                            $$.setExpr(createDataset(no_rollup, { ds, cond, tr, attr, LINK(seq) }));
                             parser->checkDistribution($3, $$.queryExpr(), false);
                             $$.setPosition($1);
                         }
@@ -8542,7 +8542,7 @@ simpleDataSet
                         {
                             parser->checkGrouped($3);
                             IHqlExpression *attr = NULL;
-                            $$.setExpr(createDataset(no_rollupgroup, $3.getExpr(), createComma($7.getExpr(), attr, $9.getExpr(), $11.getExpr())));
+                            $$.setExpr(createDataset(no_rollupgroup, { $3.getExpr(), $7.getExpr(), attr, $9.getExpr(), $11.getExpr() }));
                             $$.setPosition($1);
                         }
     | COMBINE '(' startLeftDelaySeqFilter ',' startRightFilter optCommonAttrs ')' endSelectorSequence
@@ -8550,7 +8550,7 @@ simpleDataSet
                             IHqlExpression * left = $3.getExpr();
                             IHqlExpression * right = $5.getExpr();
                             IHqlExpression * transform = parser->createDefJoinTransform(left,right,$1, $8.queryExpr(),NULL);
-                            IHqlExpression * combine = createDataset(no_combine, left, createComma(right, transform, $8.getExpr(), $6.getExpr()));
+                            IHqlExpression * combine = createDataset(no_combine, { left, right, transform, $8.getExpr(), $6.getExpr() });
                             $$.setExpr(combine);
                             $$.setPosition($1);
                         }
@@ -8558,7 +8558,7 @@ simpleDataSet
                         {
                             IHqlExpression * left = $3.getExpr();
                             IHqlExpression * right = $5.getExpr();
-                            IHqlExpression * combine = createDataset(no_combine, left, createComma(right, $7.getExpr(), $8.getExpr(), $10.getExpr()));
+                            IHqlExpression * combine = createDataset(no_combine, { left, right, $7.getExpr(), $8.getExpr(), $10.getExpr() });
                             $$.setExpr(combine);
                             $$.setPosition($1);
                         }
@@ -8566,7 +8566,7 @@ simpleDataSet
                         {
                             IHqlExpression * left = $3.getExpr();
                             IHqlExpression * right = $5.getExpr();
-                            IHqlExpression * combine = createDataset(no_combinegroup, left, createComma(right, $9.getExpr(), $10.getExpr(), createComma($12.getExpr(), $13.getExpr())));
+                            IHqlExpression * combine = createDataset(no_combinegroup, { left, right, $9.getExpr(), $10.getExpr(), $12.getExpr(), $13.getExpr() });
                             $$.setExpr(combine);
                             $$.setPosition($1);
                         }
@@ -8581,7 +8581,7 @@ simpleDataSet
                             if (counter)
                                 body = createComma(body, createAttribute(_countProject_Atom, counter));
                             IHqlExpression * loopCondition = parser->createLoopCondition(left, $6.getExpr(), NULL, $13.queryExpr(), $12.queryExpr());
-                            IHqlExpression * loopExpr = createDataset(no_loop, left, createComma(loopCondition, body, $10.getExpr(), createComma($12.getExpr(), $13.getExpr())));
+                            IHqlExpression * loopExpr = createDataset(no_loop, { left, loopCondition, body, $10.getExpr(), $12.getExpr(), $13.getExpr() });
                             parser->checkLoopFlags($1, loopExpr);
                             $$.setExpr(loopExpr);
                             $$.setPosition($1);
@@ -8598,7 +8598,7 @@ simpleDataSet
                             if (counter)
                                 body = createComma(body, createAttribute(_countProject_Atom, counter));
                             IHqlExpression * loopCondition = parser->createLoopCondition(left, $6.getExpr(), $8.getExpr(), $15.queryExpr(), $14.queryExpr());
-                            IHqlExpression * loopExpr = createDataset(no_loop, left, createComma(loopCondition, body, $12.getExpr(), createComma($14.getExpr(), $15.getExpr())));
+                            IHqlExpression * loopExpr = createDataset(no_loop, { left, loopCondition, body, $12.getExpr(), $14.getExpr(), $15.getExpr() });
                             parser->checkLoopFlags($1, loopExpr);
                             $$.setExpr(loopExpr);
                             $$.setPosition($1);
@@ -8616,7 +8616,7 @@ simpleDataSet
                             if (counter)
                                 body = createComma(body, createAttribute(_countProject_Atom, counter));
                             IHqlExpression * loopCondition = createComma($6.getExpr(), $8.getExpr(), $10.getExpr());
-                            IHqlExpression * loopExpr = createDataset(no_loop, left, createComma(loopCondition, body, $14.getExpr(), createComma($16.getExpr(), $17.getExpr())));
+                            IHqlExpression * loopExpr = createDataset(no_loop, { left, loopCondition, body, $14.getExpr(), $16.getExpr(), $17.getExpr() });
                             parser->checkLoopFlags($1, loopExpr);
                             $$.setExpr(loopExpr);
                             $$.setPosition($1);
@@ -8631,7 +8631,7 @@ simpleDataSet
                             IHqlExpression * counter = $9.getExpr();
                             if (counter)
                                 body = createComma(body, createAttribute(_countProject_Atom, counter));
-                            IHqlExpression * loopExpr = createDataset(no_graphloop, left, createComma($6.getExpr(), body, $10.getExpr(), createComma($12.getExpr(), $13.getExpr())));
+                            IHqlExpression * loopExpr = createDataset(no_graphloop, { left, $6.getExpr(), body, $10.getExpr(), $12.getExpr(), $13.getExpr() });
                             parser->checkLoopFlags($1, loopExpr);
                             $$.setExpr(loopExpr);
                             $$.setPosition($1);
@@ -8823,7 +8823,7 @@ simpleDataSet
                                 counter = createAttribute(_countProject_Atom, counter);
 
                             //MORE: This should require local otherwise it needs to do a full join type thing.
-                            OwnedHqlExpr extra = createComma($5.getExpr(), $7.getExpr(), transform, createComma($12.getExpr(), counter, $14.getExpr()));
+                            OwnedHqlExpr extra = createComma({$5.getExpr(), $7.getExpr(), transform, $12.getExpr(), counter, $14.getExpr()});
                             parser->saveDiskAccessInformation($1, extra);
                             $$.setExpr(createDataset(no_denormalize, ds, extra.getClear()));
                             $$.setPosition($1);
@@ -8834,7 +8834,7 @@ simpleDataSet
                             parser->normalizeExpression($7, type_boolean, false);
                             IHqlExpression * ds = $3.getExpr();
                             IHqlExpression * transform = $13.getExpr();
-                            OwnedHqlExpr extra = createComma($5.getExpr(), $7.getExpr(), transform, createComma($14.getExpr(), $16.getExpr(), $17.getExpr()));
+                            OwnedHqlExpr extra = createComma({$5.getExpr(), $7.getExpr(), transform, $14.getExpr(), $16.getExpr(), $17.getExpr()});
                             parser->saveDiskAccessInformation($1, extra);
                             $$.setExpr(createDataset(no_denormalizegroup, ds, extra.getClear()));
                             $$.setPosition($1);
@@ -8867,7 +8867,7 @@ simpleDataSet
                             IHqlExpression * counter = $9.getExpr();
                             if (counter)
                                 counter = createAttribute(_countProject_Atom, counter);
-                            IHqlExpression * extra = createComma($5.getExpr(), $8.getExpr(), counter, createComma($10.getExpr(), $12.getExpr()));
+                            IHqlExpression * extra = createComma({ $5.getExpr(), $8.getExpr(), counter, $10.getExpr(), $12.getExpr() });
                             $$.setExpr(createDataset(no_normalize, $3.getExpr(), extra));
                             $$.setPosition($1);
                         }
@@ -8877,7 +8877,7 @@ simpleDataSet
                             IHqlExpression * counter = $9.getExpr();
                             if (counter)
                                 counter = createAttribute(_countProject_Atom, counter);
-                            IHqlExpression * extra = createComma($5.getExpr(), $8.getExpr(), counter, createComma($10.getExpr(), $12.getExpr()));
+                            IHqlExpression * extra = createComma({$5.getExpr(), $8.getExpr(), counter, $10.getExpr(), $12.getExpr() });
                             $$.setExpr(createDataset(no_normalize, $3.getExpr(), extra));
                             $$.setPosition($1);
                         }
@@ -8940,7 +8940,7 @@ simpleDataSet
                         {
                             parser->checkGrouped($3);
                             IHqlExpression *attr = $6.getExpr();
-                            $$.setExpr(createDataset(no_filtergroup, $3.getExpr(), createComma($5.getExpr(), attr, $8.getExpr(), $9.getExpr())));
+                            $$.setExpr(createDataset(no_filtergroup, { $3.getExpr(), $5.getExpr(), attr, $8.getExpr(), $9.getExpr() }));
                             $$.setPosition($1);
                         }
     | KEYED '(' dataSet indexListOpt ')' endTopFilter
@@ -8997,7 +8997,7 @@ simpleDataSet
                             IHqlExpression * left = $3.getExpr();
                             IHqlExpression * right = $5.getExpr();
 
-                            IHqlExpression *join = createDataset(no_fetch, left, createComma(right, $7.getExpr(), $9.getExpr(), createComma($10.getExpr(), $12.getExpr())));
+                            IHqlExpression *join = createDataset(no_fetch, { left, right, $7.getExpr(), $9.getExpr(), $10.getExpr(), $12.getExpr() });
 
                             $$.setExpr(join);
                             $$.setPosition($1);
@@ -9009,7 +9009,7 @@ simpleDataSet
                             IHqlExpression * right = $5.getExpr();
                             IHqlExpression * transform = parser->createDefJoinTransform(left, right, $7, $10.queryExpr(),NULL);
 
-                            IHqlExpression *join = createDataset(no_fetch, left, createComma(right, $7.getExpr(), transform, createComma($8.getExpr(), $10.getExpr())));
+                            IHqlExpression *join = createDataset(no_fetch, { left, right, $7.getExpr(), transform, $8.getExpr(), $10.getExpr() });
 
                             $$.setExpr(join);
                             $$.setPosition($1);
@@ -9039,7 +9039,7 @@ simpleDataSet
                                 HqlExprArray args;
                                 unwindChildren(args, transform);
                                 transform.setown(createValue(no_newtransform, transform->getType(), args));
-                                OwnedHqlExpr index = createDataset(no_newkeyindex, dataset, createComma(record.getClear(), transform.getClear(), extra.getClear(), parser->getGpgSignature()));
+                                OwnedHqlExpr index = createDataset(no_newkeyindex, { dataset, record.getClear(), transform.getClear(), extra.getClear(), parser->getGpgSignature() });
                                 parser->checkValidLookupFlag(dataset, index->queryChild(3), $1);
                                 $$.setExpr(index.getClear());
                             }
@@ -9147,7 +9147,7 @@ simpleDataSet
                                 parser->reportError(ERR_EXPECTED, $1, "Expected STRING/UTF8/UNICODE");
                             }
 
-                            OwnedHqlExpr empty = createList(no_list, makeSetType(NULL), NULL);
+                            OwnedHqlExpr empty = createValue(no_list, makeSetType(NULL));
                             OwnedHqlExpr quoted = createExprAttribute(quoteAtom, LINK(empty));
                             OwnedHqlExpr separator = createExprAttribute(separatorAtom, LINK(empty));
                             OwnedHqlExpr mode = createValue(no_csv, makeNullType(), quoted.getClear(), separator.getClear(), option.getClear());
@@ -9270,7 +9270,7 @@ simpleDataSet
                             parser->normalizeExpression($5, type_numeric, false);
                             parser->normalizeExpression($7, type_numeric, false);
                             parser->normalizeExpression($9, type_numeric, false);
-                            $$.setExpr(createDataset(no_enth, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $10.getExpr())));
+                            $$.setExpr(createDataset(no_enth, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $10.getExpr() }));
                             $$.setPosition($1);
                         }
     | PIPE '(' expression ',' recordDef optPipeOptions ')'
@@ -9393,7 +9393,7 @@ simpleDataSet
                             HqlExprArray args;
                             $5.unwindCommaList(args);
                             OwnedHqlExpr stepOrder = createSortList(args);
-                            $$.setExpr(createDatasetF(no_stepped, dataset.getClear(), stepOrder.getClear(), $6.getExpr(), NULL));
+                            $$.setExpr(createDataset(no_stepped, { dataset.getClear(), stepOrder.getClear(), $6.getExpr() }));
                             $$.setPosition($1);
                         }
     | '(' dataSet  ')'  {
@@ -9525,7 +9525,7 @@ simpleDataSet
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->checkOutputRecord($9, false);
-                            IHqlExpression * ds = createDataset(no_parse, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($12.getExpr(), $14.getExpr())));
+                            IHqlExpression * ds = createDataset(no_parse, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $12.getExpr(), $14.getExpr() });
                             if (ds->hasAttribute(tomitaAtom) && (ds->queryChild(2)->queryType()->getTypeCode() == type_pattern))
                                 parser->reportError(ERR_EXPECTED_RULE, $7, "Expected a rule as parameter to PARSE");
                             $$.setExpr(ds);
@@ -9535,7 +9535,7 @@ simpleDataSet
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             IHqlExpression * record = $9.queryExpr()->queryRecord();
-                            IHqlExpression * ds = createDataset(no_newparse, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), LINK(record), createComma($9.getExpr(), $12.getExpr(), $14.getExpr())));
+                            IHqlExpression * ds = createDataset(no_newparse, { $3.getExpr(), $5.getExpr(), $7.getExpr(), LINK(record), $9.getExpr(), $12.getExpr(), $14.getExpr() });
                             if (ds->hasAttribute(tomitaAtom) && (ds->queryChild(2)->queryType()->getTypeCode() == type_pattern))
                                 parser->reportError(ERR_EXPECTED_RULE, $7, "Expected a rule as parameter to PARSE");
                             $$.setExpr(ds);
@@ -9545,14 +9545,14 @@ simpleDataSet
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             IHqlExpression * record = $7.queryExpr()->queryRecord();
-                            $$.setExpr(createDataset(no_newxmlparse, $3.getExpr(), createComma($5.getExpr(), LINK(record), $7.getExpr(), createComma($9.getExpr(), $11.getExpr()))));
+                            $$.setExpr(createDataset(no_newxmlparse, { $3.getExpr(), $5.getExpr(), LINK(record), $7.getExpr(), $9.getExpr(), $11.getExpr() }));
                             $$.setPosition($1);
                         }
     | PARSE '(' startTopLeftSeqFilter ',' expression ',' recordDef endTopLeftFilter xmlParseFlags ')' endSelectorSequence
                         {
                             parser->normalizeExpression($5, type_stringorunicode, false);
                             parser->checkOutputRecord($7, false);
-                            $$.setExpr(createDataset(no_xmlparse, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr())));
+                            $$.setExpr(createDataset(no_xmlparse, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr() }));
                             $$.setPosition($1);
                         }
     | FAIL '(' recordDef failDatasetParam ')'
@@ -9600,7 +9600,7 @@ simpleDataSet
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
                             parser->checkSoapRecord($7);
-                            $$.setExpr(createDataset(no_soapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $11.getExpr(), $14.getExpr())));
+                            $$.setExpr(createDataset(no_soapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $11.getExpr(), $14.getExpr() }));
                             parser->checkOnFailRecord($$.queryExpr(), $1);
                             $$.setPosition($1);
                         }
@@ -9608,14 +9608,14 @@ simpleDataSet
                         {
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
-                            $$.setExpr(createDataset(no_newsoapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), $13.getExpr())));
+                            $$.setExpr(createDataset(no_newsoapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $13.getExpr() }));
                             $$.setPosition($1);
                         }
     | SOAPCALL '(' expression ',' expression ',' recordDef ',' transform ',' DATASET '(' recordDef ')' ',' soapFlags ')'
                         {
                             parser->normalizeExpression($3);
                             parser->normalizeExpression($5);
-                            $$.setExpr(createDataset(no_newsoapcall, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($13.getExpr(), $16.getExpr()))));
+                            $$.setExpr(createDataset(no_newsoapcall, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $13.getExpr(), $16.getExpr() }));
                             parser->checkOnFailRecord($$.queryExpr(), $1);
                             $$.setPosition($1);
                         }
@@ -9624,7 +9624,7 @@ simpleDataSet
                             parser->normalizeExpression($5);
                             parser->normalizeExpression($7);
                             parser->checkSoapRecord($9);
-                            $$.setExpr(createDataset(no_soapcall_ds, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($13.getExpr(), $17.getExpr()))));
+                            $$.setExpr(createDataset(no_soapcall_ds, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $13.getExpr(), $17.getExpr() }));
                             $$.setPosition($1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ',' DATASET '(' recordDef ')' ',' soapFlags ')' endTopLeftFilter endSelectorSequence
@@ -9632,7 +9632,7 @@ simpleDataSet
                             parser->normalizeExpression($5);
                             parser->normalizeExpression($7);
                             parser->checkSoapRecord($9);
-                            $$.setExpr(createDataset(no_soapcall_ds, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($13.getExpr(), $16.getExpr(), $19.getExpr()))));
+                            $$.setExpr(createDataset(no_soapcall_ds, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $13.getExpr(), $16.getExpr(), $19.getExpr() }));
                             parser->checkOnFailRecord($$.queryExpr(), $1);
                             $$.setPosition($1);
                         }
@@ -9640,14 +9640,14 @@ simpleDataSet
                         {
                             parser->normalizeExpression($5);
                             parser->normalizeExpression($7);
-                            $$.setExpr(createDataset(no_newsoapcall_ds, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($11.getExpr(), $15.getExpr(), $19.getExpr()))));
+                            $$.setExpr(createDataset(no_newsoapcall_ds, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $15.getExpr(), $19.getExpr() }));
                             $$.setPosition($1);
                         }
     | SOAPCALL '(' startTopLeftSeqFilter ',' expression ',' expression ',' recordDef ',' transform ',' DATASET '(' recordDef ')' ',' soapFlags ')' endTopLeftFilter endSelectorSequence
                         {
                             parser->normalizeExpression($5);
                             parser->normalizeExpression($7);
-                            $$.setExpr(createDataset(no_newsoapcall_ds, $3.getExpr(), createComma($5.getExpr(), $7.getExpr(), $9.getExpr(), createComma($11.getExpr(), $15.getExpr(), $18.getExpr(), $21.getExpr()))));
+                            $$.setExpr(createDataset(no_newsoapcall_ds, { $3.getExpr(), $5.getExpr(), $7.getExpr(), $9.getExpr(), $11.getExpr(), $15.getExpr(), $18.getExpr(), $21.getExpr() }));
                             parser->checkOnFailRecord($$.queryExpr(), $1);
                             $$.setPosition($1);
                         }
@@ -9757,16 +9757,16 @@ simpleDataSet
                         {
                             parser->normalizeExpression($3, type_string, false);
                             parser->validateXPath($3);
-                            $$.setExpr(createDatasetF(no_xmlproject, $3.getExpr(), $5.getExpr(), parser->createUniqueId(), $6.getExpr(), NULL));
+                            $$.setExpr(createDataset(no_xmlproject, { $3.getExpr(), $5.getExpr(), parser->createUniqueId(), $6.getExpr() }));
                             $$.setPosition($1);
                         }
     | WHEN '(' dataSet ',' action sideEffectOptions ')'
                         {
-                            $$.setExpr(createDatasetF(no_executewhen, $3.getExpr(), $5.getExpr(), $6.getExpr(), NULL), $1);
+                            $$.setExpr(createDataset(no_executewhen, { $3.getExpr(), $5.getExpr(), $6.getExpr() }), $1);
                         }
     | SUCCESS '(' dataSet ',' action ')'
                         {
-                            $$.setExpr(createDatasetF(no_executewhen, $3.getExpr(), $5.getExpr(), createAttribute(successAtom), NULL), $1);
+                            $$.setExpr(createDataset(no_executewhen, { $3.getExpr(), $5.getExpr(), createAttribute(successAtom) }), $1);
                         }
     //Slightly unusual arrangement of the productions there to resolve s/r errors
     | AGGREGATE '(' startLeftDelaySeqFilter ',' startRightRowsRecord ',' transform beginList ')' endRowsGroup endSelectorSequence
@@ -9796,7 +9796,7 @@ simpleDataSet
                             if (counter)
                                 options.setown(createComma(options.getClear(), createAttribute(_countProject_Atom, counter.getClear())));
                             OwnedHqlExpr selSeq = $15.getExpr();
-                            $$.setExpr(createDatasetF(no_quantile, ds.getClear(), $5.getExpr(), sortlist.getClear(), transform.getClear(), selSeq.getClear(), options.getClear(), NULL), $1);
+                            $$.setExpr(createDataset(no_quantile, { ds.getClear(), $5.getExpr(), sortlist.getClear(), transform.getClear(), selSeq.getClear(), options.getClear() }), $1);
                         }
     | QUANTILE '(' startTopLeftSeqFilter ',' expression ',' sortListExpr beginCounterScope optQuantileOptions endCounterScope ')' endTopLeftFilter endSelectorSequence
                         {
@@ -9808,7 +9808,7 @@ simpleDataSet
                             OwnedHqlExpr selSeq = $13.getExpr();
                             OwnedHqlExpr leftSelect = createSelector(no_left, ds, selSeq);
                             OwnedHqlExpr transform = parser->createDefaultAssignTransform(ds->queryRecord(), leftSelect, $1);
-                            $$.setExpr(createDatasetF(no_quantile, ds.getClear(), $5.getExpr(), sortlist.getClear(), transform.getClear(), selSeq.getClear(), options.getClear(), NULL), $1);
+                            $$.setExpr(createDataset(no_quantile, { ds.getClear(), $5.getExpr(), sortlist.getClear(), transform.getClear(), selSeq.getClear(), options.getClear() }), $1);
                         }
     | UNORDERED '(' startTopFilter ')' endTopFilter
                         {
@@ -12484,7 +12484,7 @@ pattern0
                                 parser->reportError(ERR_AMBIGUOUS_PRODUCTION, $1, "Cannot use REPEAT on a rule with an associated row");
 
                             IHqlExpression * pattern = $3.getExpr();
-                            $$.setExpr(createValue(no_pat_repeat, parser->getCompoundRuleType(pattern), pattern, $5.getExpr(), createValue(no_any, makeNullType()), $8.getExpr()));
+                            $$.setExpr(createValue(no_pat_repeat, parser->getCompoundRuleType(pattern), { pattern, $5.getExpr(), createValue(no_any, makeNullType()), $8.getExpr() }));
                         }
     | REPEAT '(' pattern ',' expression ',' expression optMinimal ')'
                         {
@@ -12495,7 +12495,7 @@ pattern0
                                 parser->reportError(ERR_AMBIGUOUS_PRODUCTION, $1, "Cannot use REPEAT on a rule with an associated row");
 
                             IHqlExpression * pattern = $3.getExpr();
-                            $$.setExpr(createValue(no_pat_repeat, parser->getCompoundRuleType(pattern), pattern, $5.getExpr(), $7.getExpr(), $8.getExpr()));
+                            $$.setExpr(createValue(no_pat_repeat, parser->getCompoundRuleType(pattern), { pattern, $5.getExpr(), $7.getExpr(), $8.getExpr() }));
                         }
     | OPT '(' pattern optConstExpression ')'
                         {

+ 4 - 4
ecl/hql/hqlgram2.cpp

@@ -6245,7 +6245,7 @@ IHqlExpression * HqlGram::createLoopCondition(IHqlExpression * leftDs, IHqlExpre
     if (!filter) filter = createAttribute(_omitted_Atom);
     if (!loopCond) loopCond= createAttribute(_omitted_Atom);
 
-    return createComma(count, filter, loopCond);
+    return createComma({count, filter, loopCond });
 }
 
 void HqlGram::reportError(int errNo, const attribute& a, const char* format, ...)
@@ -7966,7 +7966,7 @@ IHqlExpression * HqlGram::createIndexFromRecord(IHqlExpression * record, IHqlExp
     finalRecord.setown(cleanIndexRecord(finalRecord));
 
     OwnedHqlExpr transform = createClearTransform(finalRecord, errpos);
-    return createDataset(no_newkeyindex, ds, createComma(LINK(finalRecord), replaceOperator(transform, no_newtransform), newAttrs.getClear()));
+    return createDataset(no_newkeyindex, { ds, LINK(finalRecord), replaceOperator(transform, no_newtransform), newAttrs.getClear() });
 }
 
 
@@ -10800,9 +10800,9 @@ IHqlExpression * HqlGram::createListIndex(attribute & list, attribute & which, I
         reportError(ERR_NO_MULTI_ARRAY, list, "Multi dimension array index is not supported");
 
     if (childType && isDatasetType(childType))
-        return createDataset(no_rowsetindex, expr.getClear(), createComma(which.getExpr(), attr));
+        return createDataset(no_rowsetindex, { expr.getClear(), which.getExpr(), attr });
     else
-        return createList(no_index, LINK(childType), createComma(expr.getClear(), which.getExpr(), attr));
+        return createValue(no_index, LINK(childType), { expr.getClear(), which.getExpr(), attr }, true);
 }
 
 void HqlGram::checkCompatibleTransforms(HqlExprArray & values, IHqlExpression * record, attribute & errpos)

+ 4 - 4
ecl/hql/hqlmeta.cpp

@@ -1282,7 +1282,7 @@ IHqlExpression * ensureSortedForGroup(IHqlExpression * table, IHqlExpression *so
     IHqlExpression * ds = LINK(table);
     if (isGrouped(ds))
         ds = createDataset(no_group, ds, NULL);
-    return createDatasetF(no_sort, ds, LINK(sortList), attr, NULL);
+    return createDataset(no_sort, { ds, LINK(sortList), attr });
 }
 
 
@@ -1549,7 +1549,7 @@ IHqlExpression * convertSubSortToGroupedSort(IHqlExpression * expr)
 
     assertex(!isGrouped(dataset) || expr->hasAttribute(globalAtom));
     OwnedHqlExpr attr = isLocalActivity(expr) ? createLocalAttribute() : NULL;
-    OwnedHqlExpr grouped = createDatasetF(no_group, LINK(dataset), LINK(grouping), LINK(attr), NULL);
+    OwnedHqlExpr grouped = createDataset(no_group, { LINK(dataset), LINK(grouping), LINK(attr) });
 
     HqlExprArray args;
     args.append(*grouped.getClear());
@@ -1579,7 +1579,7 @@ static IHqlExpression * createSubSorted(IHqlExpression * dataset, IHqlExpression
     const bool removeGrouping = ignoreGrouping && isGrouped(dataset);
     OwnedHqlExpr attr = isLocal ? createLocalAttribute() : (isGrouped(dataset) && ignoreGrouping) ? createAttribute(globalAtom) : NULL;
     OwnedHqlExpr input = removeGrouping ? createDataset(no_group, LINK(dataset)) : LINK(dataset);
-    OwnedHqlExpr subsort = createDatasetF(no_subsort, LINK(input), LINK(newOrder), LINK(alreadySorted), LINK(attr), NULL);
+    OwnedHqlExpr subsort = createDataset(no_subsort, { LINK(input), LINK(newOrder), LINK(alreadySorted), LINK(attr) });
     //Grouped subsorts never generated, global subsorts (if generated) get converted to a global group
     if (!isLocal && !alwaysLocal)
         subsort.setown(convertSubSortToGroupedSort(subsort));
@@ -1900,7 +1900,7 @@ static IHqlExpression * createPreserveTableInfo(IHqlExpression * newTable, IHqlE
     
     LinkedHqlExpr ret = newTable;
     if (distribution || globalSort || localSort || grouping || groupSort)
-        ret.setown(createDatasetF(no_preservemeta, LINK(newTable), ensureNonNull(distribution), ensureNonNull(globalSort), ensureNonNull(localSort),  ensureNonNull(grouping), ensureNonNull(groupSort), NULL));
+        ret.setown(createDataset(no_preservemeta, { LINK(newTable), ensureNonNull(distribution), ensureNonNull(globalSort), ensureNonNull(localSort),  ensureNonNull(grouping), ensureNonNull(groupSort) }));
     return original->cloneAllAnnotations(ret);
 }
 

+ 1 - 1
ecl/hql/hqlpregex.cpp

@@ -192,7 +192,7 @@ IHqlExpression * HqlRegexParser::parse1()
             advance();
             minimal = createAttribute(minimalAtom);
         }
-        arg.setown(createValue(no_pat_repeat, makePatternType(), arg.getClear(), createConstant((__int64)low), createConstant((__int64)high), minimal));
+        arg.setown(createValue(no_pat_repeat, makePatternType(), { arg.getClear(), createConstant((__int64)low), createConstant((__int64)high), minimal }));
     }
 }
 

+ 11 - 11
ecl/hql/hqlutil.cpp

@@ -1231,7 +1231,7 @@ IHqlExpression * JoinOrderSpotter::doFindJoinSortOrders(IHqlExpression * conditi
                 IHqlExpression * common = findCommonExpression(lowerStrip,upperStrip);
                 if (common)
                 {
-                    joinOrder.slidingMatches.append(*createValue(no_between, makeBoolType(), LINK(leftStrip), LINK(lowerStrip), LINK(upperStrip), createExprAttribute(commonAtom, LINK(common))));
+                    joinOrder.slidingMatches.append(*createValue(no_between, makeBoolType(), { LINK(leftStrip), LINK(lowerStrip), LINK(upperStrip), createExprAttribute(commonAtom, LINK(common)) }));
                     return NULL;
                 }
             }
@@ -1340,7 +1340,7 @@ void JoinOrderSpotter::findImplicitBetween(IHqlExpression * condition, HqlExprAr
                         IHqlExpression * common = findCommonExpression(lowerStrip,upperStrip);
                         if (common)
                         {
-                            slidingMatches.append(*createValue(no_between, makeBoolType(), LINK(leftStrip), LINK(lowerStrip), LINK(upperStrip), createExprAttribute(commonAtom, LINK(common))));
+                            slidingMatches.append(*createValue(no_between, makeBoolType(), { LINK(leftStrip), LINK(lowerStrip), LINK(upperStrip), createExprAttribute(commonAtom, LINK(common)) }));
                             matched.append(*condition);
                             matched.append(cur);
                             pending.zap(cur);
@@ -1808,13 +1808,13 @@ IHqlExpression * createIf(IHqlExpression * cond, IHqlExpression * left, IHqlExpr
 {
     assertex(right);
     if (left->isDataset() || right->isDataset())
-        return createDataset(no_if, cond, createComma(left, right));
+        return createDataset(no_if, { cond, left, right });
 
     if (left->isDictionary() || right->isDictionary())
-        return createDictionary(no_if, cond, createComma(left, right));
+        return createDictionary(no_if, { cond, left, right });
 
     if (left->isDatarow() || right->isDatarow())
-        return createRow(no_if, cond, createComma(left, right));
+        return createRow(no_if, { cond, left, right });
 
     ITypeInfo * leftType = left->queryType();
     ITypeInfo * rightType = right->queryType();
@@ -4311,14 +4311,14 @@ IHqlExpression * createGetResultFromSetResult(IHqlExpression * setResult, ITypeI
     switch (valueType->getTypeCode())
     {
     case type_table:
-        return createDataset(no_getresult, LINK(queryOriginalRecord(valueType)), createComma(LINK(seqAttr), LINK(aliasAttr)));
+        return createDataset(no_getresult, { LINK(queryOriginalRecord(valueType)), LINK(seqAttr), LINK(aliasAttr) });
     case type_groupedtable:
-        return createDataset(no_getresult, LINK(queryOriginalRecord(valueType)), createComma(LINK(seqAttr), createAttribute(groupedAtom), LINK(aliasAttr)));
+        return createDataset(no_getresult, { LINK(queryOriginalRecord(valueType)), LINK(seqAttr), createAttribute(groupedAtom), LINK(aliasAttr) });
     case type_dictionary:
-        return createDictionary(no_workunit_dataset, LINK(queryOriginalRecord(valueType)), createComma(LINK(seqAttr), LINK(aliasAttr)));
+        return createDictionary(no_workunit_dataset, { LINK(queryOriginalRecord(valueType)), LINK(seqAttr), LINK(aliasAttr) });
     case type_row:
     case type_record:
-         return createRow(no_getresult, LINK(queryOriginalRecord(valueType)), createComma(LINK(seqAttr), LINK(aliasAttr)));
+         return createRow(no_getresult, { LINK(queryOriginalRecord(valueType)), LINK(seqAttr), LINK(aliasAttr) });
     }
 
     return createValue(no_getresult, valueType.getLink(), LINK(seqAttr), LINK(aliasAttr));
@@ -5783,8 +5783,8 @@ bool SplitDatasetAttributeTransformer::split(SharedHqlExpr & dataset, SharedHqlE
         {
             OwnedHqlExpr field = createField(unnamedId, value->getType(), NULL);
             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);
+            OwnedHqlExpr combine = createDataset(no_combine, { LINK(&newDatasets.item(0)), LINK(&newDatasets.item(1)), LINK(transform), LINK(selSeq) });
+            OwnedHqlExpr first = createRow(no_selectnth, { LINK(combine), getSizetConstant(1), createAttribute(noBoundCheckAtom) });
             dataset.setown(createDatasetFromRow(first.getClear()));
             attribute.setown(createSelectExpr(LINK(dataset->queryNormalizedSelector()), LINK(field)));
             break;

+ 1 - 1
ecl/hqlcpp/hqlcppds.cpp

@@ -551,7 +551,7 @@ IReferenceSelector * HqlCppTranslator::buildNewRow(BuildCtx & ctx, IHqlExpressio
             IHqlExpression * record = expr->queryRecord();
             OwnedHqlExpr serializedRecord = getSerializedForm(record, serializeForm);
 
-            OwnedHqlExpr temp = createDatasetF(no_getresult, LINK(serializedRecord), LINK(seqAttr), LINK(nameAttr), NULL);
+            OwnedHqlExpr temp = createDataset(no_getresult, { LINK(serializedRecord), LINK(seqAttr), LINK(nameAttr) });
 
             //Do not use noBoundCheck for STORED because invalid xml may be provided that defines no rows.
             OwnedHqlExpr option = matchesConstantValue(seqAttr->queryChild(0), ResultSequenceStored) ? nullptr : createAttribute(noBoundCheckAtom);

+ 1 - 1
ecl/hqlcpp/hqlhtcpp.cpp

@@ -8721,7 +8721,7 @@ IHqlExpression * HqlCppTranslator::createLoopSubquery(IHqlExpression * dataset,
     OwnedHqlExpr rowsExpr = createDataset(no_rows, LINK(left), LINK(rowsid));
     transformedBody.setown(replaceExpression(transformedBody, rowsExpr, inputResult));
 
-    OwnedHqlExpr result = createValue(no_setgraphresult, makeVoidType(), LINK(transformedBody), LINK(graphid), getSizetConstant(0), createAttribute(_loop_Atom));
+    OwnedHqlExpr result = createValue(no_setgraphresult, makeVoidType(), { LINK(transformedBody), LINK(graphid), getSizetConstant(0), createAttribute(_loop_Atom) });
     graphBuilder.addAction(result);
 
     if (transformedAgain)

+ 1 - 1
ecl/hqlcpp/hqliproj.cpp

@@ -1096,7 +1096,7 @@ IHqlExpression * ComplexImplicitProjectInfo::createOutputProject(IHqlExpression
         return createDataset(no_hqlproject, LINK(ds), createComma(transform, LINK(seq)));
     else
         assertex(!ds->isDictionary());
-    return createRow(no_projectrow, LINK(ds), createComma(transform, LINK(seq)));
+    return createRow(no_projectrow, { LINK(ds), transform, LINK(seq) });
 }
 
 

+ 1 - 1
ecl/hqlcpp/hqllib.cpp

@@ -408,7 +408,7 @@ static IHqlExpression * convertScalarToDataset(IHqlExpression * expr)
             IHqlExpression * field = expr->queryChild(1);
             OwnedHqlExpr record = createRecord(field);
             OwnedHqlExpr assign = createAssign(createSelectExpr(createSelector(no_self, record, NULL), LINK(field)), LINK(newExpr));
-            OwnedHqlExpr row = createRow(no_projectrow, LINK(ds), createComma(createValue(no_transform, makeTransformType(record->getType()), LINK(assign)), LINK(selSeq)));
+            OwnedHqlExpr row = createRow(no_projectrow, { LINK(ds), createValue(no_transform, makeTransformType(record->getType()), LINK(assign)), LINK(selSeq) });
             return LINK(row);
             //Following is more strictly correct, but messes up the resourcing.
             //return createDatasetFromRow(LINK(row));

+ 2 - 2
ecl/hqlcpp/hqlresource.cpp

@@ -6377,9 +6377,9 @@ IHqlExpression * EclResourcer::createResourced(IHqlExpression * expr, ResourceGr
             if (!source->isAction())
             {
                 if (source->isDataset())
-                    source = createDatasetF(no_split, source, createAttribute(balancedAtom), createUniqueId(), NULL);
+                    source = createDataset(no_split, { source, createAttribute(balancedAtom), createUniqueId() });
                 else
-                    source = createRowF(no_split, source, createAttribute(balancedAtom), createUniqueId(), NULL);
+                    source = createRow(no_split, { source, createAttribute(balancedAtom), createUniqueId() });
 
                 ownerGraph->addSharedInput(expr->queryBody(), source);
             }

+ 3 - 3
ecl/hqlcpp/hqlsource.cpp

@@ -359,7 +359,7 @@ IHqlExpression * createTableWithoutVirtuals(VirtualFieldsInfo & info, IHqlExpres
 
     VirtualRecordTransformCreator mapper(newDataset);
     IHqlExpression * newTransform = mapper.createMappingTransform(no_newtransform, record, newDataset);
-    OwnedHqlExpr projected = createDatasetF(no_newusertable, newDataset, LINK(record), newTransform, createAttribute(_internal_Atom), NULL);
+    OwnedHqlExpr projected = createDataset(no_newusertable, { newDataset, LINK(record), newTransform, createAttribute(_internal_Atom) });
     return tableExpr->cloneAllAnnotations(projected);
 }
 
@@ -380,7 +380,7 @@ static IHqlExpression * createTableFromSerialized(IHqlExpression * tableExpr)
     OwnedHqlExpr newTable = replaceChild(tableExpr->queryBody(), 1, diskRecordWithMeta);
 
     OwnedHqlExpr transform = createRecordMappingTransform(no_newtransform, record, newTable->queryNormalizedSelector());
-    OwnedHqlExpr projected = createDatasetF(no_newusertable, LINK(newTable), LINK(record), LINK(transform), createAttribute(_internal_Atom), NULL);
+    OwnedHqlExpr projected = createDataset(no_newusertable, { LINK(newTable), LINK(record), LINK(transform), createAttribute(_internal_Atom) });
     return tableExpr->cloneAllAnnotations(projected);
 }
 
@@ -536,7 +536,7 @@ IHqlExpression * HqlCppTranslator::buildIndexFromPhysical(IHqlExpression * expr)
 
         VirtualRecordTransformCreator mapper(newDataset);
         IHqlExpression * newTransform = mapper.createMappingTransform(no_newtransform, record, newDataset);
-        newProject.setown(createDatasetF(no_newusertable, LINK(newDataset), LINK(record), newTransform, createAttribute(_internal_Atom), NULL));
+        newProject.setown(createDataset(no_newusertable, { LINK(newDataset), LINK(record), newTransform, createAttribute(_internal_Atom) }));
         newProject.setown(tableExpr->cloneAllAnnotations(newProject));
     }
     else

+ 11 - 11
ecl/hqlcpp/hqlttcpp.cpp

@@ -2736,7 +2736,7 @@ IHqlExpression * ThorHqlTransformer::normalizeGroup(IHqlExpression * expr)
                 //changing a heavyweight global sort into a lightweight distribute,merge
                 OwnedHqlExpr sortOrder = getExistingSortOrder(dataset, true, true);
                 OwnedHqlExpr mergeAttr = createExprAttribute(mergeAtom, replaceSelector(sortOrder, queryActiveTableSelector(), dataset));
-                sorted.setown(createDatasetF(no_distribute, LINK(dataset), LINK(hashed), mergeAttr.getClear(), NULL));
+                sorted.setown(createDataset(no_distribute, { LINK(dataset), LINK(hashed), mergeAttr.getClear() }));
                 sorted.setown(cloneInheritedAnnotations(expr, sorted));
             }
             else
@@ -2756,7 +2756,7 @@ IHqlExpression * ThorHqlTransformer::normalizeGroup(IHqlExpression * expr)
     }
 
     //Do a local group after the sort because we know they can't overlap...
-    OwnedHqlExpr ret = createDatasetF(no_group, sorted.getClear(), LINK(sortlist), createLocalAttribute(), NULL);
+    OwnedHqlExpr ret = createDataset(no_group, { sorted.getClear(), LINK(sortlist), createLocalAttribute() });
     return expr->cloneAllAnnotations(ret);
 }
 
@@ -2835,7 +2835,7 @@ IHqlExpression * ThorHqlTransformer::normalizeCoGroup(IHqlExpression * expr)
                 OwnedHqlExpr mergeAttr;
                 if (bestSortOrder && isAlreadySorted(&cur, bestSortOrder, true, true, false))
                     mergeAttr.setown(createExprAttribute(mergeAtom, replaceSelector(bestSortOrder, queryActiveTableSelector(), &cur)));
-                OwnedHqlExpr distributedInput = createDatasetF(no_distribute, LINK(&cur), LINK(mappedDistribution), mergeAttr.getClear(), NULL);
+                OwnedHqlExpr distributedInput = createDataset(no_distribute, { LINK(&cur), LINK(mappedDistribution), mergeAttr.getClear() });
                 distributedInput.setown(cloneInheritedAnnotations(expr, distributedInput));
                 inputs.replace(*distributedInput.getClear(), iReplace);
             }
@@ -2867,7 +2867,7 @@ IHqlExpression * ThorHqlTransformer::normalizeCoGroup(IHqlExpression * expr)
         OwnedHqlExpr appended = createDataset(no_addfiles, inputs);
         appended.setown(cloneInheritedAnnotations(expr, appended));
         OwnedHqlExpr mappedOrder = replaceSelector(grouping, queryActiveTableSelector(), appended);
-        merged.setown(createDatasetF(no_sort, LINK(appended), mappedOrder.getClear(), LINK(localFlag), NULL));
+        merged.setown(createDataset(no_sort, { LINK(appended), mappedOrder.getClear(), LINK(localFlag) } ));
     }
 
     //Now group by the grouping condition
@@ -2993,7 +2993,7 @@ IHqlExpression * ThorHqlTransformer::normalizeJoinAndGroup(IHqlExpression * expr
     assertex(groupOrder);
     OwnedHqlExpr left = createSelector(no_left, expr->queryChild(0), querySelSeq(expr));
     OwnedHqlExpr leftSortOrder = replaceSelector(groupOrder, left, newLeft);
-    newLeft.setown(createDatasetF(no_sort, newLeft.getClear(), LINK(leftSortOrder), LINK(newLocalAttr), NULL));
+    newLeft.setown(createDataset(no_sort, { newLeft.getClear(), LINK(leftSortOrder), LINK(newLocalAttr) }));
 
     if (oldRight == oldLeft)
         newRight.set(newLeft);
@@ -3021,11 +3021,11 @@ IHqlExpression * ThorHqlTransformer::normalizeJoinAndGroup(IHqlExpression * expr
     {
         OwnedHqlExpr hashOut = createValue(no_hash32, makeIntType(4, false), LINK(mappedOrder));
         OwnedHqlExpr mergeOut = createExprAttribute(mergeAtom, LINK(mappedOrder));
-        distributed.setown(createDatasetF(no_distribute, LINK(newJoin), hashOut.getClear(), mergeOut.getClear(), NULL));
+        distributed.setown(createDataset(no_distribute, { LINK(newJoin), hashOut.getClear(), mergeOut.getClear() }));
     }
 
     //And finally group it.
-    return createDatasetF(no_group, LINK(distributed), LINK(mappedOrder), LINK(newLocalAttr), NULL);
+    return createDataset(no_group, { LINK(distributed), LINK(mappedOrder), LINK(newLocalAttr) });
 }
 
 static IHqlExpression * queryDistributionKey(IHqlExpression * rhs)
@@ -3171,7 +3171,7 @@ IHqlExpression * ThorHqlTransformer::normalizeJoinOrDenormalize(IHqlExpression *
                     OwnedHqlExpr keyedCondition = joinInfo.getContiguousJoinCondition(numKeyedFields);
                     if (keyedCondition)
                     {
-                        OwnedHqlExpr distribute = createDataset(no_keyeddistribute, LINK(leftDs), createComma(LINK(rhsKey), keyedCondition.getClear(), LINK(seq)));
+                        OwnedHqlExpr distribute = createDataset(no_keyeddistribute, { LINK(leftDs), LINK(rhsKey), keyedCondition.getClear(), LINK(seq) });
                         HqlExprArray args;
                         args.append(*distribute.getClear());
                         unwindChildren(args, expr, 1);
@@ -3806,9 +3806,9 @@ IHqlExpression * ThorHqlTransformer::normalizeMergeAggregate(IHqlExpression * ex
 
     OwnedHqlExpr mergeAttr = createExprAttribute(mergeAtom, LINK(mappedGrouping));
     OwnedHqlExpr hashed = createValue(no_hash32, LINK(unsignedType), LINK(mappedGrouping), createAttribute(internalAtom));
-    OwnedHqlExpr redistributed = createDatasetF(no_distribute, LINK(transformedFirstAggregate), LINK(hashed), mergeAttr.getClear(), NULL);
+    OwnedHqlExpr redistributed = createDataset(no_distribute, { LINK(transformedFirstAggregate), LINK(hashed), mergeAttr.getClear() });
     redistributed.setown(cloneInheritedAnnotations(expr, redistributed));
-    OwnedHqlExpr grouped = createDatasetF(no_group, LINK(redistributed), LINK(mappedGrouping), createLocalAttribute(), NULL);
+    OwnedHqlExpr grouped = createDataset(no_group, { LINK(redistributed), LINK(mappedGrouping), createLocalAttribute() });
     grouped.setown(cloneInheritedAnnotations(expr, grouped));
 
     HqlExprArray args;
@@ -9881,7 +9881,7 @@ IHqlExpression * HqlLinkedChildRowTransformer::ensureInputSerialized(IHqlExpress
     //and then use it to expand references to the unserialized format
     IHqlExpression * selector = dataset->queryNormalizedSelector();
     OwnedHqlExpr mapTransform = createRecordMappingTransform(no_newtransform, serializedRecord, selector);
-    OwnedHqlExpr newDataset = createDatasetF(no_newusertable, LINK(dataset), LINK(serializedRecord), LINK(mapTransform), LINK(selSeq), NULL);
+    OwnedHqlExpr newDataset = createDataset(no_newusertable, { LINK(dataset), LINK(serializedRecord), LINK(mapTransform), LINK(selSeq) });
 
     NewProjectMapper2 mapper;
     mapper.setMapping(mapTransform);