Browse Source

HPCC-11333 Add platform support for BUILD(MAXLENGTH)

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 11 years ago
parent
commit
6771274775

+ 10 - 5
ecl/hthor/hthor.cpp

@@ -1009,13 +1009,18 @@ void CHThorIndexWriteActivity::execute()
 {
     size32_t maxDiskRecordSize;
     if (helper.queryDiskRecordSize()->isVariableSize())
-        maxDiskRecordSize = 0x8000;
-    else
     {
-        maxDiskRecordSize = helper.queryDiskRecordSize()->getFixedSize();
-        if (maxDiskRecordSize > 0x8000)
-            throw MakeStringException(99, "Index minimum record length (%d) exceeds 32K internal limit", maxDiskRecordSize);
+        if (helper.getFlags() & TIWmaxlength)
+            maxDiskRecordSize = helper.getMaxKeySize();
+        else
+            maxDiskRecordSize = KEYBUILD_MAXLENGTH; // Current default behaviour, could be improved in the future
     }
+    else
+        maxDiskRecordSize = helper.queryDiskRecordSize()->getFixedSize();
+
+    if (maxDiskRecordSize > KEYBUILD_MAXLENGTH)
+        throw MakeStringException(99, "Index maximum record length (%d) exceeds 32K internal limit", maxDiskRecordSize);
+
     OwnedMalloc<char> rowBuffer(maxDiskRecordSize, true);
 
     // Loop thru the results

+ 9 - 5
roxie/ccd/ccdserver.cpp

@@ -11371,14 +11371,18 @@ public:
         bool isVariable = helper.queryDiskRecordSize()->isVariableSize();
         size32_t maxDiskRecordSize;
         if (isVariable)
-            maxDiskRecordSize = 0x8000;
-        else
         {
+            if (helper.getFlags() & TIWmaxlength)
+                maxDiskRecordSize = helper.getMaxKeySize();
+            else
+                maxDiskRecordSize = KEYBUILD_MAXLENGTH; // Current default behaviour, could be improved in the future
+        }
+        else
             maxDiskRecordSize = helper.queryDiskRecordSize()->getFixedSize();
-            if (maxDiskRecordSize > 0x8000)
-                throw MakeStringException(99, "Index minimum record length (%d) exceeds 32k internal limit", maxDiskRecordSize);
 
-        }
+        if (maxDiskRecordSize > KEYBUILD_MAXLENGTH)
+            throw MakeStringException(99, "Index maximum record length (%d) exceeds 32k internal limit", maxDiskRecordSize);
+
         OwnedMalloc<char> rowBuffer(maxDiskRecordSize, true);
 
         unsigned __int64 fileSize = 0;

+ 13 - 3
thorlcr/activities/indexwrite/thindexwrite.cpp

@@ -62,12 +62,22 @@ public:
         OwnedRoxieString fname(helper->getFileName());
         dlfn.set(fname);
         isLocal = 0 != (TIWlocal & helper->getFlags());
-        unsigned minSize = helper->queryDiskRecordSize()->getMinRecordSize();
+        IOutputMetaData * diskSize = helper->queryDiskRecordSize();
+        unsigned minSize = diskSize->getMinRecordSize();
         if (minSize > KEYBUILD_MAXLENGTH)
             throw MakeActivityException(this, 0, "Index minimum record length (%d) exceeds %d internal limit", minSize, KEYBUILD_MAXLENGTH);
-        unsigned maxSize = helper->queryDiskRecordSize()->getRecordSize(NULL);
+        unsigned maxSize;
+        if (diskSize->isVariableSize())
+        {
+            if (TIWmaxlength & helper->getFlags())
+                maxSize = helper->getMaxKeySize();
+            else
+                maxSize = KEYBUILD_MAXLENGTH; //Current default behaviour, could be improved in the future
+        }
+        else
+            maxSize = diskSize->getFixedSize();
         if (maxSize > KEYBUILD_MAXLENGTH)
-            throw MakeActivityException(this, 0, "Index maximum record length (%d) exceeds %d internal limit. Minimum size = %d, try setting index MAXLENGTH", maxSize, KEYBUILD_MAXLENGTH, minSize);
+            throw MakeActivityException(this, 0, "Index maximum record length (%d) exceeds %d internal limit. Maximum size = %d, try setting index MAXLENGTH", maxSize, KEYBUILD_MAXLENGTH, minSize);
 
         singlePartKey = 0 != (helper->getFlags() & TIWsmall) || dlfn.isExternal();
         clusters.kill();

+ 12 - 5
thorlcr/activities/indexwrite/thindexwriteslave.cpp

@@ -171,11 +171,18 @@ public:
                 }
             }
         }
-        assertex(!(helper->queryDiskRecordSize()->getMetaFlags() & MDFneedserializedisk));
-        maxDiskRecordSize = helper->queryDiskRecordSize()->isVariableSize() ? KEYBUILD_MAXLENGTH : helper->queryDiskRecordSize()->getFixedSize();
-        // NB: the max [ecl] length is not used, other than setting a max field in the header.
-        // However, legacy systems (<=702) check that query rec length == key rec len.
-        maxDiskRecordSize = helper->queryDiskRecordSize()->getRecordSize(NULL);
+
+        IOutputMetaData * diskSize = helper->queryDiskRecordSize();
+        assertex(!(diskSize->getMetaFlags() & MDFneedserializedisk));
+        if (diskSize->isVariableSize())
+        {
+            if (TIWmaxlength & helper->getFlags())
+                maxDiskRecordSize = helper->getMaxKeySize();
+            else
+                maxDiskRecordSize = KEYBUILD_MAXLENGTH; //Current default behaviour, could be improved in the future
+        }
+        else
+            maxDiskRecordSize = diskSize->getFixedSize();
         reportOverflow = false;
     }