Author: reschke
Date: Mon Nov 23 17:27:22 2015
New Revision: 1715898

URL: http://svn.apache.org/viewvc?rev=1715898&view=rev
Log:
OAK-3670: RDBDocumentStore on SQLServer: off-by-one bug may cause truncated 
JSON to be written

Enable the test case and fix the off-by-one bug (and add one extra byte of 
safety)

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java?rev=1715898&r1=1715897&r2=1715898&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
 Mon Nov 23 17:27:22 2015
@@ -298,7 +298,7 @@ public enum RDBDocumentStoreDB {
              * To avoid truncation when concatenating force an error when limit
              * is above the octet limit
              */
-            return "CASE WHEN LEN(DATA) <= " + (dataOctetLimit - dataLength) + 
" THEN (DATA + CAST(? AS nvarchar(" + dataOctetLimit
+            return "CASE WHEN LEN(DATA) < " + (dataOctetLimit - dataLength) + 
" THEN (DATA + CAST(? AS nvarchar(" + dataOctetLimit
                     + "))) ELSE (DATA + CAST(DATA AS nvarchar(max))) END";
 
         }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1715898&r1=1715897&r2=1715898&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
 Mon Nov 23 17:27:22 2015
@@ -114,7 +114,7 @@ public class RDBDocumentStoreJDBC {
         t.append("update " + tmd.getName() + " set ");
         t.append(setModifiedConditionally ? "MODIFIED = case when ? > MODIFIED 
then ? else MODIFIED end, " : "MODIFIED = ?, ");
         t.append("MODCOUNT = MODCOUNT + 1, DSIZE = DSIZE + ?, ");
-        t.append("DATA = " + 
this.dbInfo.getConcatQueryString(tmd.getDataLimitInOctets(), 
appendData.length()) + " ");
+        t.append("DATA = " + 
this.dbInfo.getConcatQueryString(tmd.getDataLimitInOctets(), 
appendData.length() + 1) + " ");
         t.append("where ID in (");
         for (int i = 0; i < ids.size(); i++) {
             if (i != 0) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1715898&r1=1715897&r2=1715898&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
 Mon Nov 23 17:27:22 2015
@@ -35,7 +35,6 @@ import java.util.UUID;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Condition;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -348,7 +347,6 @@ public class BasicDocumentStoreTest exte
     }
 
     @Test
-    @Ignore("OAK-3670")
     public void testRepeatingUpdatesOnSQLServer() {
         // simulates two updates to trigger the off-by-one bug documented in 
OAK-3670
         String id = this.getClass().getName() + 
".testRepeatingUpdatesOnSQLServer";


Reply via email to