瀏覽代碼

Merge branch 'candidate-7.12.x' into candidate-8.0.x

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 4 年之前
父節點
當前提交
9525af3448

+ 1 - 1
.github/workflows/smoketest.yml

@@ -302,7 +302,7 @@ jobs:
         find -name '.git*' -prune -o -newer ../cmake-timestamp -type f -print | cpio -p -dum ../src-cache
         echo "Merge patch files:"
         git diff --name-only ${{ steps.vars.outputs.base_ref_sha }} ${{ steps.vars.outputs.sha }}
-        git diff ${{ steps.vars.outputs.base_ref_sha }} ${{ steps.vars.outputs.sha }} > ../merge-patch
+        git diff --binary ${{ steps.vars.outputs.base_ref_sha }} ${{ steps.vars.outputs.sha }} > ../merge-patch
 
     # - alter stock ecl-test.json, to point to install dir (using jq)
     # - create a clean copy of the install directory (for later reuse)

+ 1 - 1
cmake_modules/getpackagerevisionarch.sh

@@ -83,7 +83,7 @@ elif [ -e /etc/redhat-release ]; then
   if [ -x /bin/rpm ]; then
     OUTPUT="${OUTPUT}\npackage=rpm"
     OS_GROUP=`/bin/rpm -q --qf "%{NAME}" --whatprovides /etc/redhat-release | sed 's/-release.*//' |  tr '[A-Z]' '[a-z]'`
-    REDHAT_VERSION=`/bin/rpm -q --qf "%{VERSION}" --whatprovides /etc/redhat-release`
+    REDHAT_VERSION=`/bin/rpm -q --qf "%{VERSION}" --whatprovides /etc/redhat-release | cut -f1 -d"."`
     case "$OS_GROUP" in
       "centos"* | "fedora")
         if [ ${NOARCH} -eq 0 ]; then

+ 4 - 2
ecl/hqlcpp/hqlhtcpp.cpp

@@ -3950,8 +3950,10 @@ unsigned HqlCppTranslator::buildRtlIfBlockField(StringBuffer & instanceName, IHq
 
         bool isComplex = extraFilter || !extractor.isSingleMatchCondition();
         const char * baseClass = isComplex ? "RtlComplexIfBlockTypeInfo" : "RtlSimpleIfBlockTypeInfo";
-        if (isComplex)
-            fieldType |= RFTMnoserialize;
+        //Currently interpreted ifblocks() are far too inefficient to be used remotely, so unconditionally mark it as noserialize
+        //change when HPCC-25794 is fixed
+        //if (isComplex)
+        fieldType |= RFTMnoserialize;
 
         //The ifblock needs a unique instance of the class to evaluate the test
         BuildCtx fieldclassctx(declarectx);

+ 5 - 0
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -99,6 +99,11 @@ bool validateWsWorkunitAccess(IEspContext& ctx, const char* wuid, SecAccessFlags
     return ctx.validateFeatureAccess(getWuAccessType(*cw, ctx.queryUserId()), minAccess, false);
 }
 
+bool validateWsWorkunitAccessByOwnerId(IEspContext& ctx, const char* owner, SecAccessFlags minAccess)
+{
+    return ctx.validateFeatureAccess(getWuAccessType(owner, ctx.queryUserId()), minAccess, false);
+}
+
 void ensureWsWorkunitAccessByOwnerId(IEspContext& ctx, const char* owner, SecAccessFlags minAccess)
 {
     if (!ctx.validateFeatureAccess(getWuAccessType(owner, ctx.queryUserId()), minAccess, false))

+ 1 - 0
esp/services/ws_workunits/ws_workunitsHelpers.hpp

@@ -76,6 +76,7 @@ void ensureWsWorkunitAccess(IEspContext& context, const char* wuid, SecAccessFla
 void ensureWsWorkunitAccessByOwnerId(IEspContext& context, const char* owner, SecAccessFlags minAccess);
 void ensureWsCreateWorkunitAccess(IEspContext& cxt);
 bool validateWsWorkunitAccess(IEspContext& context, const char* wuid, SecAccessFlags minAccess);
+bool validateWsWorkunitAccessByOwnerId(IEspContext& context, const char* owner, SecAccessFlags minAccess);
 
 const char *getGraphNum(const char *s,unsigned &num);
 

+ 42 - 39
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -109,6 +109,40 @@ void setActionResult(const char* wuid, CECLWUActions action, const char* result,
     results->append(*res.getClear());
 }
 
+IPropertyTree *getArchivedWorkUnitProperties(const char *wuid, bool dfuWU)
+{
+    SocketEndpoint ep;
+    getSashaServiceEP(ep, "sasha-wu-archiver", true);
+    Owned<INode> node = createINode(ep);
+    if (!node)
+        throw MakeStringException(ECLWATCH_INODE_NOT_FOUND, "INode not found.");
+
+    StringBuffer tmp;
+    Owned<ISashaCommand> cmd = createSashaCommand();
+    cmd->addId(wuid);
+    cmd->setAction(SCA_GET);
+    cmd->setArchived(true);
+    if (dfuWU)
+        cmd->setDFU(true);
+    if (!cmd->send(node, 1*60*1000))
+        throw MakeStringException(ECLWATCH_CANNOT_CONNECT_ARCHIVE_SERVER,
+            "Sasha (%s) took too long to respond from: Get workUnit properties for %s.",
+            ep.getUrlStr(tmp).str(), wuid);
+
+    if ((cmd->numIds() < 1) || (cmd->numResults() < 1))
+        return nullptr;
+
+    cmd->getResult(0, tmp.clear());
+    if(tmp.length() < 1)
+        return nullptr;
+
+    Owned<IPropertyTree> wu = createPTreeFromXMLString(tmp.str());
+    if (!wu)
+        return nullptr;
+
+    return wu.getClear();
+}
+
 bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IProperties* params, IArrayOf<IConstWUActionResult>* results)
 {
     if (!wuids.length())
@@ -128,6 +162,14 @@ bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IP
             }
             if ((action == CECLWUActions_Archive) && !validateWsWorkunitAccess(context, wuid, SecAccess_Full))
                 msg.appendf("Access denied for Workunit %s. ", wuid);
+            else if (action == CECLWUActions_Restore)
+            {
+                Owned<IPropertyTree> wuProps = getArchivedWorkUnitProperties(wuid, false);
+                if (!wuProps)
+                    msg.appendf("Archived workunit %s not found.", wuid);
+                else if (!validateWsWorkunitAccessByOwnerId(context, wuProps->queryProp("@submitID"), SecAccess_Full))
+                    msg.appendf("Access denied for Workunit %s. ", wuid);
+            }
         }
         if (!msg.isEmpty())
             throw makeStringException(ECLWATCH_INVALID_INPUT, msg);
@@ -137,11 +179,6 @@ bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IP
         {
             StringBuffer reply;
             cmd->getId(idx, reply);
-
-            const char* wuid = wuids.item(idx);
-            if ((action == CECLWUActions_Restore) && !validateWsWorkunitAccess(context, wuid, SecAccess_Full))
-                reply.appendf("Access denied for Workunit %s. ", wuid);
-
             AuditSystemAccess(context.queryUserId(), true, "%s", reply.str());
         }
         return true;
@@ -3128,40 +3165,6 @@ bool CWsWorkunitsEx::onWUFile(IEspContext &context,IEspWULogFileRequest &req, IE
     return true;
 }
 
-IPropertyTree *getArchivedWorkUnitProperties(const char *wuid, bool dfuWU)
-{
-    SocketEndpoint ep;
-    getSashaServiceEP(ep, "sasha-wu-archiver", true);
-    Owned<INode> node = createINode(ep);
-    if (!node)
-        throw MakeStringException(ECLWATCH_INODE_NOT_FOUND, "INode not found.");
-
-    StringBuffer tmp;
-    Owned<ISashaCommand> cmd = createSashaCommand();
-    cmd->addId(wuid);
-    cmd->setAction(SCA_GET);
-    cmd->setArchived(true);
-    if (dfuWU)
-        cmd->setDFU(true);
-    if (!cmd->send(node, 1*60*1000))
-        throw MakeStringException(ECLWATCH_CANNOT_CONNECT_ARCHIVE_SERVER,
-            "Sasha (%s) took too long to respond from: Get workUnit properties for %s.",
-            ep.getUrlStr(tmp).str(), wuid);
-
-    if ((cmd->numIds() < 1) || (cmd->numResults() < 1))
-        return nullptr;
-
-    cmd->getResult(0, tmp.clear());
-    if(tmp.length() < 1)
-        return nullptr;
-
-    Owned<IPropertyTree> wu = createPTreeFromXMLString(tmp.str());
-    if (!wu)
-        return nullptr;
-
-    return wu.getClear();
-}
-
 void getWorkunitCluster(IEspContext &context, const char *wuid, SCMStringBuffer &cluster, bool checkArchiveWUs)
 {
     if (isEmpty(wuid))

+ 4 - 4
esp/src/eclwatch/WUDetailsWidget.js

@@ -266,10 +266,10 @@ define([
                         context.emailBody.set("disabled", false);
                     } else {
                         context.emailCheckbox.set("disabled", true);
-                        context.emailTo.set("disabled", true);
-                        context.emailFrom.set("disabled", true);
-                        context.emailSubject.set("disabled", true);
-                        context.emailBody.set("disabled", true);
+                        context.emailTo && context.emailTo.set("disabled", true);
+                        context.emailFrom && context.emailFrom.set("disabled", true);
+                        context.emailSubject && context.emailSubject.set("disabled", true);
+                        context.emailBody && context.emailBody.set("disabled", true);
                     }
                     context.updateInput("ZapWUID", null, response.WUGetZAPInfoResponse.WUID);
                     context.updateInput("BuildVersion", null, response.WUGetZAPInfoResponse.BuildVersion);

+ 23 - 21
esp/src/eclwatch/templates/WUDetailsWidget.html

@@ -168,27 +168,29 @@
         </div>
     </div>
     <div id="${id}ZapDialog" data-dojo-type="dijit.Dialog" title="${i18n.ZippedAnalysisPackage}">
-        <div id="${id}ZapForm" style="width:460px;" method="post" enctype="application/x-www-form-urlencoded" data-dojo-type="dijit.form.Form">
-            <div data-dojo-props="cols:2" data-dojo-type="hpcc.TableContainer">
-                <input id="${id}ZapName" title="${i18n.FileName}:" name="ZAPFileName" colspan="2" data-dojo-props="trim: true," data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}ZapWUID" title="${i18n.WUID}:" name="Wuid" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}BuildVersion" title="${i18n.ESPBuildVersion}:" name="BuildVersion" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}ESPIPAddress" title="${i18n.ESPNetworkAddress}:" name="ESPIPAddress" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}ThorIPAddress" title="${i18n.ThorNetworkAddress}:" name="ThorIPAddress" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}ZapDescription" title="${i18n.Description}:" name="ProblemDescription" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
-                <input id="${id}WarnHistory" title="${i18n.History}:" name="WhatChanged" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
-                <input id="${id}WarnTimings" title="${i18n.Timings}:" name="WhereSlow" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
-                <input id="${id}Password" title="${i18n.PasswordOpenZAP}:" name="Password" cols="22" colspan="2" type="password" data-dojo-props="trim: true" data-dojo-type="dijit.form.ValidationTextBox" />
-                <input id="${id}IncludeSlaveLogsCheckbox" title="${i18n.IncludeSlaveLogs}:" name="IncludeThorSlaveLog" cols="22" colspan="2" type="checkbox" data-dojo-type="dijit.form.CheckBox" />
-                <input id="${id}EmailCheckbox" title="${i18n.SendEmail}:" name="SendEmail" cols="22" colspan="2" type="checkbox" data-dojo-type="dijit.form.CheckBox" />
-                <input id="${id}EmailTo" title="${i18n.EmailTo}:" name="EmailTo" colspan="2" data-dojo-props="trim:true, readonly:true, placeHolder:'See Configuration Manager.'" data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}EmailFrom" title="${i18n.EmailFrom}:" name="EmailFrom" colspan="2" data-dojo-props="trim:true, placeHolder:'See Configuration Manager.'" data-dojo-type="dijit.form.TextBox" />
-                <input id="${id}EmailSubject" title="${i18n.EmailSubject}:" name="EmailSubject" colspan="2" data-dojo-props="trim:true" data-dojo-type="dijit.form.ValidationTextBox" required="false" />
-                <input id="${id}EmailBody" title="${i18n.EmailBody}:" name="EmailBody" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
-            </div>
-            <div class="dijitDialogPaneActionBar">
-                <button id="${id}onZapSubmit" data-dojo-attach-event="onClick:_onSubmitDialog" type="submit" data-dojo-type="dijit.form.Button">${i18n.Apply}</button>
-                <button style="float:left" data-dojo-attach-event="onClick:_onCancelDialog" data-dojo-type="dijit.form.Button">${i18n.Cancel}</button>
+        <div class="dijitDialogPaneContentArea">
+            <div id="${id}ZapForm" style="width:460px;" method="post" enctype="application/x-www-form-urlencoded" data-dojo-type="dijit.form.Form">
+                <div data-dojo-props="cols:2" data-dojo-type="hpcc.TableContainer">
+                    <input id="${id}ZapName" title="${i18n.FileName}:" name="ZAPFileName" colspan="2" data-dojo-props="trim: true," data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}ZapWUID" title="${i18n.WUID}:" name="Wuid" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}BuildVersion" title="${i18n.ESPBuildVersion}:" name="BuildVersion" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}ESPIPAddress" title="${i18n.ESPNetworkAddress}:" name="ESPIPAddress" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}ThorIPAddress" title="${i18n.ThorNetworkAddress}:" name="ThorIPAddress" colspan="2" data-dojo-props="trim: true, readonly: true," data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}ZapDescription" title="${i18n.Description}:" name="ProblemDescription" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
+                    <input id="${id}WarnHistory" title="${i18n.History}:" name="WhatChanged" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
+                    <input id="${id}WarnTimings" title="${i18n.Timings}:" name="WhereSlow" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
+                    <input id="${id}Password" title="${i18n.PasswordOpenZAP}:" name="Password" cols="22" colspan="2" type="password" data-dojo-props="trim: true" data-dojo-type="dijit.form.ValidationTextBox" />
+                    <input id="${id}IncludeSlaveLogsCheckbox" title="${i18n.IncludeSlaveLogs}:" name="IncludeThorSlaveLog" cols="22" colspan="2" type="checkbox" data-dojo-type="dijit.form.CheckBox" />
+                    <input id="${id}EmailCheckbox" title="${i18n.SendEmail}:" name="SendEmail" cols="22" colspan="2" type="checkbox" data-dojo-type="dijit.form.CheckBox" />
+                    <input id="${id}EmailTo" title="${i18n.EmailTo}:" name="EmailTo" colspan="2" data-dojo-props="trim:true, readonly:true, placeHolder:'See Configuration Manager.'" data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}EmailFrom" title="${i18n.EmailFrom}:" name="EmailFrom" colspan="2" data-dojo-props="trim:true, placeHolder:'See Configuration Manager.'" data-dojo-type="dijit.form.TextBox" />
+                    <input id="${id}EmailSubject" title="${i18n.EmailSubject}:" name="EmailSubject" colspan="2" data-dojo-props="trim:true" data-dojo-type="dijit.form.ValidationTextBox" required="false" />
+                    <input id="${id}EmailBody" title="${i18n.EmailBody}:" name="EmailBody" cols="22" colspan="2" data-dojo-type="dijit.form.SimpleTextarea" />
+                </div>
+                <div class="dijitDialogPaneActionBar">
+                    <button id="${id}onZapSubmit" data-dojo-attach-event="onClick:_onSubmitDialog" type="submit" data-dojo-type="dijit.form.Button">${i18n.Apply}</button>
+                    <button style="float:left" data-dojo-attach-event="onClick:_onCancelDialog" data-dojo-type="dijit.form.Button">${i18n.Cancel}</button>
+                </div>
             </div>
         </div>
     </div>

+ 6 - 8
esp/src/src/ESPPreflight.ts

@@ -32,15 +32,13 @@ class SystemServersStore extends ESPRequest.Store {
         const results = [];
         for (const key in response.ServiceList) {
             for (const i in response.ServiceList[key]) {
-                if (key !== "TpEclServers") {
-                    response.ServiceList[key][i].map(function (item) {
-                        const cleanKey = key.replace("Tp", "");
-                        results.push(item);
-                        lang.mixin(item, {
-                            parent: cleanKey
-                        });
+                response.ServiceList[key][i].forEach(function (item) {
+                    const cleanKey = key.replace("Tp", "");
+                    results.push(item);
+                    lang.mixin(item, {
+                        parent: cleanKey
                     });
-                }
+                });
             }
         }
         response.ServiceList = results;

+ 13 - 6
initfiles/bin/init_thorslave.in

@@ -66,6 +66,19 @@ stop_slaves()
 
 start_slaves()
 {
+    
+    # insuring parent directory structure is setup properly
+    mkdir -p $instancedir
+    mkdir -p $(dirname $logfile)
+
+    cd $instancedir
+
+    log "checking killall dependency"
+    if ! killall -V > /dev/null 2>&1 ; then
+        log "killall dependency not met. Cannot start thorslaves"
+        exit 1
+    fi
+
     killall -0 dafilesrv > /dev/null 2>&1
     if [[ $? -ne 0 ]];then
         # insuring dafilesrv is running on the machine as it is a prerequisite
@@ -79,12 +92,6 @@ start_slaves()
         fi
     fi
 
-    # insuring parent directory structure is setup properly
-    mkdir -p $instancedir
-    mkdir -p $(dirname $logfile)
-
-    cd $instancedir
-
     log "dependency dafilesrv started"
 
     ulimit -Sc hard > /dev/null

+ 39 - 470
testing/regress/ecl/key/serializeifblocks.xml

@@ -33,44 +33,13 @@
 }</Result_1></Row>
 </Dataset>
 <Dataset name='Result 2'>
- <Row><Result_2>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[4]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_2></Row>
+ <Row><Result_2>This type structure cannot be serialized</Result_2></Row>
 </Dataset>
 <Dataset name='Result 3'>
- <Row><Result_3>true</Result_3></Row>
+ <Row><Result_3>false</Result_3></Row>
 </Dataset>
 <Dataset name='Result 4'>
- <Row><Result_4>true</Result_4></Row>
+ <Row><Result_4>false</Result_4></Row>
 </Dataset>
 <Dataset name='Result 5'>
  <Row><Result_5>{
@@ -107,44 +76,13 @@
 }</Result_5></Row>
 </Dataset>
 <Dataset name='Result 6'>
- <Row><Result_6>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=(4,10),[200,250]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_6></Row>
+ <Row><Result_6>This type structure cannot be serialized</Result_6></Row>
 </Dataset>
 <Dataset name='Result 7'>
- <Row><Result_7>true</Result_7></Row>
+ <Row><Result_7>false</Result_7></Row>
 </Dataset>
 <Dataset name='Result 8'>
- <Row><Result_8>true</Result_8></Row>
+ <Row><Result_8>false</Result_8></Row>
 </Dataset>
 <Dataset name='Result 9'>
  <Row><Result_9>{
@@ -181,44 +119,13 @@
 }</Result_9></Row>
 </Dataset>
 <Dataset name='Result 10'>
- <Row><Result_10>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[200,1000)&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_10></Row>
+ <Row><Result_10>This type structure cannot be serialized</Result_10></Row>
 </Dataset>
 <Dataset name='Result 11'>
- <Row><Result_11>true</Result_11></Row>
+ <Row><Result_11>false</Result_11></Row>
 </Dataset>
 <Dataset name='Result 12'>
- <Row><Result_12>true</Result_12></Row>
+ <Row><Result_12>false</Result_12></Row>
 </Dataset>
 <Dataset name='Result 13'>
  <Row><Result_13>{
@@ -255,44 +162,13 @@
 }</Result_13></Row>
 </Dataset>
 <Dataset name='Result 14'>
- <Row><Result_14>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[1],[2],[3],[99],[1000]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_14></Row>
+ <Row><Result_14>This type structure cannot be serialized</Result_14></Row>
 </Dataset>
 <Dataset name='Result 15'>
- <Row><Result_15>true</Result_15></Row>
+ <Row><Result_15>false</Result_15></Row>
 </Dataset>
 <Dataset name='Result 16'>
- <Row><Result_16>true</Result_16></Row>
+ <Row><Result_16>false</Result_16></Row>
 </Dataset>
 <Dataset name='Result 17'>
  <Row><Result_17>{
@@ -333,48 +209,13 @@
 }</Result_17></Row>
 </Dataset>
 <Dataset name='Result 18'>
- <Row><Result_18>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[&apos;a &apos;],[&apos;b &apos;],[&apos;c &apos;],[&apos;f &apos;,&apos;k &apos;),[&apos;xx&apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_18></Row>
+ <Row><Result_18>This type structure cannot be serialized</Result_18></Row>
 </Dataset>
 <Dataset name='Result 19'>
- <Row><Result_19>true</Result_19></Row>
+ <Row><Result_19>false</Result_19></Row>
 </Dataset>
 <Dataset name='Result 20'>
- <Row><Result_20>true</Result_20></Row>
+ <Row><Result_20>false</Result_20></Row>
 </Dataset>
 <Dataset name='Result 21'>
  <Row><Result_21>{
@@ -415,48 +256,13 @@
 }</Result_21></Row>
 </Dataset>
 <Dataset name='Result 22'>
- <Row><Result_22>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 1028,
-  &quot;length&quot;: 0
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[&apos;\\&apos;&apos;],[&apos;a&apos;],[&apos;b &apos;],[&apos;bxx&apos;],[&apos;faa&apos;,&apos;kaa&apos;],(&apos;xxa&apos;,&apos;xyz&apos;)&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 4,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 1028
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_22></Row>
+ <Row><Result_22>This type structure cannot be serialized</Result_22></Row>
 </Dataset>
 <Dataset name='Result 23'>
- <Row><Result_23>true</Result_23></Row>
+ <Row><Result_23>false</Result_23></Row>
 </Dataset>
 <Dataset name='Result 24'>
- <Row><Result_24>true</Result_24></Row>
+ <Row><Result_24>false</Result_24></Row>
 </Dataset>
 <Dataset name='Result 25'>
  <Row><Result_25>{
@@ -497,48 +303,13 @@
 }</Result_25></Row>
 </Dataset>
 <Dataset name='Result 26'>
- <Row><Result_26>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[&apos;a &apos;],[&apos;b &apos;],(&apos;fa&apos;,&apos;ka&apos;],(&apos;xx&apos;,&apos;xy&apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_26></Row>
+ <Row><Result_26>This type structure cannot be serialized</Result_26></Row>
 </Dataset>
 <Dataset name='Result 27'>
- <Row><Result_27>true</Result_27></Row>
+ <Row><Result_27>false</Result_27></Row>
 </Dataset>
 <Dataset name='Result 28'>
- <Row><Result_28>true</Result_28></Row>
+ <Row><Result_28>false</Result_28></Row>
 </Dataset>
 <Dataset name='Result 29'>
  <Row><Result_29>{
@@ -579,48 +350,13 @@
 }</Result_29></Row>
 </Dataset>
 <Dataset name='Result 30'>
- <Row><Result_30>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=(&apos;fa&apos;,&apos;ka&apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_30></Row>
+ <Row><Result_30>This type structure cannot be serialized</Result_30></Row>
 </Dataset>
 <Dataset name='Result 31'>
- <Row><Result_31>true</Result_31></Row>
+ <Row><Result_31>false</Result_31></Row>
 </Dataset>
 <Dataset name='Result 32'>
- <Row><Result_32>true</Result_32></Row>
+ <Row><Result_32>false</Result_32></Row>
 </Dataset>
 <Dataset name='Result 33'>
  <Row><Result_33>{
@@ -661,48 +397,13 @@
 }</Result_33></Row>
 </Dataset>
 <Dataset name='Result 34'>
- <Row><Result_34>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[&apos;a &apos;],[&apos;b &apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_34></Row>
+ <Row><Result_34>This type structure cannot be serialized</Result_34></Row>
 </Dataset>
 <Dataset name='Result 35'>
- <Row><Result_35>true</Result_35></Row>
+ <Row><Result_35>false</Result_35></Row>
 </Dataset>
 <Dataset name='Result 36'>
- <Row><Result_36>true</Result_36></Row>
+ <Row><Result_36>false</Result_36></Row>
 </Dataset>
 <Dataset name='Result 37'>
  <Row><Result_37>{
@@ -743,48 +444,13 @@
 }</Result_37></Row>
 </Dataset>
 <Dataset name='Result 38'>
- <Row><Result_38>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=(&apos;ax&apos;,&apos;bx&apos;],(&apos;dx&apos;,&apos;ex&apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_38></Row>
+ <Row><Result_38>This type structure cannot be serialized</Result_38></Row>
 </Dataset>
 <Dataset name='Result 39'>
- <Row><Result_39>true</Result_39></Row>
+ <Row><Result_39>false</Result_39></Row>
 </Dataset>
 <Dataset name='Result 40'>
- <Row><Result_40>true</Result_40></Row>
+ <Row><Result_40>false</Result_40></Row>
 </Dataset>
 <Dataset name='Result 41'>
  <Row><Result_41>{
@@ -825,48 +491,13 @@
 }</Result_41></Row>
 </Dataset>
 <Dataset name='Result 42'>
- <Row><Result_42>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 4,
-  &quot;length&quot;: 2
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty3&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[&apos;a &apos;],[&apos;b &apos;]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty2&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 2,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 4
-  },
-  {
-   &quot;type&quot;: &quot;ty3&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_42></Row>
+ <Row><Result_42>This type structure cannot be serialized</Result_42></Row>
 </Dataset>
 <Dataset name='Result 43'>
- <Row><Result_43>true</Result_43></Row>
+ <Row><Result_43>false</Result_43></Row>
 </Dataset>
 <Dataset name='Result 44'>
- <Row><Result_44>true</Result_44></Row>
+ <Row><Result_44>false</Result_44></Row>
 </Dataset>
 <Dataset name='Result 45'>
  <Row><Result_45>{
@@ -903,44 +534,13 @@
 }</Result_45></Row>
 </Dataset>
 <Dataset name='Result 46'>
- <Row><Result_46>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=[4]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_46></Row>
+ <Row><Result_46>This type structure cannot be serialized</Result_46></Row>
 </Dataset>
 <Dataset name='Result 47'>
- <Row><Result_47>true</Result_47></Row>
+ <Row><Result_47>false</Result_47></Row>
 </Dataset>
 <Dataset name='Result 48'>
- <Row><Result_48>true</Result_48></Row>
+ <Row><Result_48>false</Result_48></Row>
 </Dataset>
 <Dataset name='Result 49'>
  <Row><Result_49>{
@@ -977,42 +577,11 @@
 }</Result_49></Row>
 </Dataset>
 <Dataset name='Result 50'>
- <Row><Result_50>{
- &quot;ty1&quot;: {
-  &quot;fieldType&quot;: 257,
-  &quot;length&quot;: 8
- },
- &quot;ty2&quot;: {
-  &quot;fieldType&quot;: 1067,
-  &quot;length&quot;: 0,
-  &quot;filterType&quot;: &quot;ty1&quot;,
-  &quot;filter&quot;: &quot;0=(4,10),[200,250]&quot;,
-  &quot;fields&quot;: [
-   {
-    &quot;name&quot;: &quot;extra&quot;,
-    &quot;type&quot;: &quot;ty1&quot;,
-    &quot;flags&quot;: 257
-   }
-  ]
- },
- &quot;fieldType&quot;: 1037,
- &quot;length&quot;: 8,
- &quot;fields&quot;: [
-  {
-   &quot;name&quot;: &quot;id&quot;,
-   &quot;type&quot;: &quot;ty1&quot;,
-   &quot;flags&quot;: 257
-  },
-  {
-   &quot;type&quot;: &quot;ty2&quot;,
-   &quot;flags&quot;: 1067
-  }
- ]
-}</Result_50></Row>
+ <Row><Result_50>This type structure cannot be serialized</Result_50></Row>
 </Dataset>
 <Dataset name='Result 51'>
- <Row><Result_51>true</Result_51></Row>
+ <Row><Result_51>false</Result_51></Row>
 </Dataset>
 <Dataset name='Result 52'>
- <Row><Result_52>true</Result_52></Row>
+ <Row><Result_52>false</Result_52></Row>
 </Dataset>

File diff suppressed because it is too large
+ 4 - 113
testing/regress/ecl/key/serializetypes.xml