This is an automated email from the ASF dual-hosted git repository.

wyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ef4268f9f [MULTIPLE ISSUES] Fix columnar delete issues
1ef4268f9f is described below

commit 1ef4268f9f53c87b824df0c759dc5a2b63d72877
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Fri May 26 10:48:08 2023 -0700

    [MULTIPLE ISSUES] Fix columnar delete issues
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - ASTERIXDB-3199: Fixes issue when merging components
      contain only antimatter tuples
    - ASTERIXDB-3200: Fix NPE for operator deep-copy with
      meta record
    - ASTERIXDB-3201: Fix NPE when merging an empty component
    
    Also, this patch introduces ColumnValueException, which is
    thrown in case of a columnar-related error. The exception
    collects several pieces of information related to an
    encountered error.
    
    Change-Id: I9a28b7fe7b7b89636dd10b62769b2e78d7979654
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17554
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Wail Alkowaileet <[email protected]>
    Reviewed-by: Murtadha Al Hubail <[email protected]>
---
 .../rules/pushdown/ExpectedSchemaBuilder.java      |   3 +-
 .../api/common/AsterixHyracksIntegrationUtil.java  |  13 ++-
 .../runtime/SqlppSinglePartitionExecutionTest.java |  85 +++++++++++++++
 .../src/test/resources/cc-single-partition.conf    |  54 ++++++++++
 .../queries/column-pushdown/meta.001.sqlpp         |  55 ++++++++++
 .../results/column-pushdown/meta.001.plan          | 119 +++++++++++++++++++++
 .../column/delete/003/003.001.ddl.sqlpp}           |  33 ++----
 .../column/delete/003/003.002.update.sqlpp         |  28 +++++
 .../column/delete/003/003.003.get.http}            |  29 +----
 .../column/delete/003/003.004.update.sqlpp}        |  30 +-----
 .../column/delete/003/003.005.get.http}            |  29 +----
 .../column/delete/003/003.006.update.sqlpp}        |  30 +-----
 .../column/delete/003/003.007.get.http}            |  29 +----
 .../column/delete/003/003.008.update.sqlpp}        |  30 +-----
 .../column/delete/003/003.009.get.http}            |  29 +----
 .../column/delete/003/003.010.sleep.sqlpp}         |  28 +----
 .../column/delete/003/003.011.query.sqlpp}         |  29 +----
 .../column/delete/003/003.012.query.sqlpp}         |  30 +-----
 .../column/delete/004/004.001.ddl.sqlpp}           |  33 ++----
 .../column/delete/004/004.002.update.sqlpp}        |  33 ++----
 .../column/delete/004/004.003.get.http}            |  29 +----
 .../column/delete/004/004.004.update.sqlpp}        |  29 +----
 .../column/delete/004/004.005.get.http}            |  29 +----
 .../column/delete/004/004.006.update.sqlpp}        |  29 +----
 .../column/delete/004/004.007.get.http}            |  29 +----
 .../column/delete/004/004.008.update.sqlpp}        |  34 ++----
 .../column/delete/004/004.009.get.http}            |  29 +----
 .../column/delete/004/004.010.update.sqlpp}        |  30 +-----
 .../column/delete/004/004.011.get.http}            |  29 +----
 .../column/delete/004/004.012.query.sqlpp}         |  30 +-----
 .../results/column/delete/003/003.003.regexadm     |   1 +
 .../results/column/delete/003/003.005.regexadm     |   1 +
 .../results/column/delete/003/003.007.regexadm     |   1 +
 .../results/column/delete/003/003.009.regexadm     |   1 +
 .../results/column/delete/003/003.011.adm          |   1 +
 .../results/column/delete/003/003.012.adm          |   1 +
 .../results/column/delete/004/004.003.regexadm     |   1 +
 .../results/column/delete/004/004.005.regexadm     |   1 +
 .../results/column/delete/004/004.007.regexadm     |   1 +
 .../results/column/delete/004/004.009.regexadm     |   1 +
 .../results/column/delete/004/004.011.regexadm     |   1 +
 .../results/column/delete/004/004.012.adm          |   4 +
 .../runtimets/testsuite_single_partition_sqlpp.xml |  33 ++++++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |  10 ++
 .../asterix/column/assembler/AssemblerState.java   |  14 +++
 .../column/assembler/PrimitiveValueAssembler.java  |  18 +++-
 .../assembler/RepeatedPrimitiveValueAssembler.java |  17 ++-
 .../lsm/merge/MergeColumnTupleWriter.java          |  95 +++++++++++-----
 .../column/operation/query/ColumnAssembler.java    |  24 ++++-
 .../operation/query/QueryColumnMetadata.java       |  23 ++--
 .../query/QueryColumnWithMetaMetadata.java         |  10 +-
 .../column/tuple/MergeColumnTupleReference.java    |  13 +++
 .../asterix/column/values/IColumnValuesReader.java |   9 ++
 .../values/reader/AbstractColumnValuesReader.java  |  37 +++++--
 .../values/reader/PrimitiveColumnValuesReader.java |  24 +++--
 .../RepeatedPrimitiveColumnValuesReader.java       |  35 ++++--
 .../reader/AbstractDummyColumnValuesReader.java    |  10 ++
 .../reader/DummyPrimitiveColumnValueReader.java    |   8 ++
 .../DummyRepeatedPrimitiveColumnValueReader.java   |  12 +++
 .../btree/column/error/ColumnarValueException.java |  36 +++----
 .../lsm/tuples/AbstractColumnTupleReference.java   |   4 +
 61 files changed, 789 insertions(+), 704 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/ExpectedSchemaBuilder.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/ExpectedSchemaBuilder.java
index 3f83d1a644..36a77c9a39 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/ExpectedSchemaBuilder.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/ExpectedSchemaBuilder.java
@@ -70,7 +70,8 @@ public class ExpectedSchemaBuilder {
     }
 
     public DataProjectionFiltrationInfo createProjectionInfo(LogicalVariable 
recordVariable) {
-        return createProjectionInfo(recordVariable, Collections.emptyMap(), 
Collections.emptyMap(), null, null);
+        return createProjectionInfo(recordVariable, Collections.emptyMap(), 
Collections.emptyMap(), null,
+                Collections.emptyMap());
     }
 
     public DataProjectionFiltrationInfo createProjectionInfo(LogicalVariable 
recordVariable,
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
index ccedd08e78..c2b523612c 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
@@ -101,15 +101,14 @@ public class AsterixHyracksIntegrationUtil {
      * main method to run a simple 2 node cluster in-process
      * suggested VM arguments: <code>-enableassertions -Xmx2048m 
-Dfile.encoding=UTF-8</code>
      *
-     * @param args
-     *            unused
+     * @param args unused
      */
     public static void main(String[] args) throws Exception {
         TestUtils.redirectLoggingToConsole();
         AsterixHyracksIntegrationUtil integrationUtil = new 
AsterixHyracksIntegrationUtil();
         try {
             integrationUtil.run(Boolean.getBoolean("cleanup.start"), 
Boolean.getBoolean("cleanup.shutdown"),
-                    System.getProperty("conf.path", DEFAULT_CONF_FILE));
+                    getConfPath());
         } catch (Exception e) {
             LOGGER.fatal("Unexpected exception", e);
             System.exit(1);
@@ -444,4 +443,12 @@ public class AsterixHyracksIntegrationUtil {
                     TestPrimaryIndexOperationTrackerFactory.class);
         }
     }
+
+    private static String getConfPath() {
+        String providedPath = System.getProperty("conf.path");
+        if (providedPath == null) {
+            return DEFAULT_CONF_FILE;
+        }
+        return joinPath(RESOURCES_PATH, providedPath);
+    }
 }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppSinglePartitionExecutionTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppSinglePartitionExecutionTest.java
new file mode 100644
index 0000000000..d0823c70e5
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppSinglePartitionExecutionTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.runtime;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Runs the SQL++ specific tests on a cluster with a single partition
+ */
+@RunWith(Parameterized.class)
+public class SqlppSinglePartitionExecutionTest {
+    protected static final String TEST_CONFIG_FILE_NAME = 
"src/test/resources/cc-single-partition.conf";
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        final TestExecutor testExecutor = new TestExecutor();
+        LangExecutionUtil.setUp(TEST_CONFIG_FILE_NAME, testExecutor);
+        setNcEndpoints(testExecutor);
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        LangExecutionUtil.tearDown();
+    }
+
+    @Parameters(name = "SqlppSinglePartitionExecutionTest {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        return LangExecutionUtil.tests("only_sqlpp.xml", 
"testsuite_single_partition_sqlpp.xml");
+    }
+
+    protected TestCaseContext tcCtx;
+
+    public SqlppSinglePartitionExecutionTest(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Test
+    public void test() throws Exception {
+        LangExecutionUtil.test(tcCtx);
+    }
+
+    private static void setNcEndpoints(TestExecutor testExecutor) {
+        final NodeControllerService[] ncs = 
ExecutionTestUtil.integrationUtil.ncs;
+        final Map<String, InetSocketAddress> ncEndPoints = new HashMap<>();
+        final String ip = InetAddress.getLoopbackAddress().getHostAddress();
+        for (NodeControllerService nc : ncs) {
+            final String nodeId = nc.getId();
+            final INcApplicationContext appCtx = (INcApplicationContext) 
nc.getApplicationContext();
+            int apiPort = appCtx.getExternalProperties().getNcApiPort();
+            ncEndPoints.put(nodeId, InetSocketAddress.createUnresolved(ip, 
apiPort));
+        }
+        testExecutor.setNcEndPoints(ncEndPoints);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf 
b/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf
new file mode 100644
index 0000000000..dab765bfb7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf
@@ -0,0 +1,54 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=target/tmp/asterix_nc1/iodevice1
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc]
+credential.file=src/test/resources/security/passwd
+python.cmd.autolocate=true
+python.env=FOO=BAR=BAZ,BAR=BAZ
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m 
-Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.size=128MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+credential.file=src/test/resources/security/passwd
+
+[common]
+log.dir = logs/
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+compiler.textsearchmemory=160KB
+compiler.windowmemory=192KB
+messaging.frame.size=4096
+messaging.frame.count=512
+storage.buffercache.pagesize=32KB
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/column-pushdown/meta.001.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/column-pushdown/meta.001.sqlpp
new file mode 100644
index 0000000000..e5e90c1915
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/column-pushdown/meta.001.sqlpp
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ DROP DATAVERSE test IF EXISTS;
+ CREATE DATAVERSE test;
+ USE test;
+
+ CREATE TYPE CH2Type AS {
+ };
+
+ CREATE TYPE CH2MetaType AS {
+     uid:int
+ };
+
+ CREATE DATASET `customer`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `district`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `history`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `item`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY META().uid 
WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `neworder`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `orders`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `stock`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY META().uid 
WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `warehouse`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `supplier`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `nation`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+ CREATE DATASET `region`(CH2Type) WITH META(CH2MetaType) PRIMARY KEY 
META().uid WITH {"storage-format": {"format": "column"}};
+
+SELECT s.s_i_id, SUM(s.s_order_cnt) as ordercount
+FROM   nation n, supplier su, stock s
+WHERE  s.s_w_id * s.s_i_id MOD 10000 = su.su_suppkey
+  AND  su.su_nationkey = n.n_nationkey
+  AND  n.n_name = 'Germany'
+GROUP BY s.s_i_id
+HAVING SUM(s.s_order_cnt) > (
+     SELECT VALUE SUM(s1.s_order_cnt) * 0.00005
+     FROM nation n1, supplier su1, stock s1
+     WHERE s1.s_w_id * s1.s_i_id MOD 10000 = su1.su_suppkey
+       AND su1.su_nationkey = n1.n_nationkey
+       AND n1.n_name = 'Germany')[0]
+ORDER BY ordercount DESC;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/column-pushdown/meta.001.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/column-pushdown/meta.001.plan
new file mode 100644
index 0000000000..01a8496d3f
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/column-pushdown/meta.001.plan
@@ -0,0 +1,119 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$194(DESC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$194(DESC)]  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- NESTED_LOOP  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- SORT_GROUP_BY[$$223]  |PARTITIONED|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- HASH_PARTITION_EXCHANGE [$$223]  |PARTITIONED|
+                          -- SORT_GROUP_BY[$$178]  |PARTITIONED|
+                                  {
+                                    -- AGGREGATE  |LOCAL|
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  }
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$192][$$191]  
|PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$192]  
|PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$207][$$206]  
|PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                    -- REPLICATE  |PARTITIONED|
+                                                      -- 
HASH_PARTITION_EXCHANGE [$$212]  |PARTITIONED|
+                                                        -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- STREAM_SELECT  
|PARTITIONED|
+                                                            -- ASSIGN  
|PARTITIONED|
+                                                              -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- 
DATASOURCE_SCAN (test.nation)  |PARTITIONED|
+                                                                    -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                    -- REPLICATE  |PARTITIONED|
+                                                      -- 
HASH_PARTITION_EXCHANGE [$$211]  |PARTITIONED|
+                                                        -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- ASSIGN  
|PARTITIONED|
+                                                            -- STREAM_PROJECT  
|PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$191]  
|PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                              -- REPLICATE  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                  -- STREAM_PROJECT  
|PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                      -- DATASOURCE_SCAN 
(test.stock)  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
+                                                          -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                      -- STREAM_PROJECT  |UNPARTITIONED|
+                        -- ASSIGN  |UNPARTITIONED|
+                          -- AGGREGATE  |UNPARTITIONED|
+                            -- STREAM_PROJECT  |UNPARTITIONED|
+                              -- ASSIGN  |UNPARTITIONED|
+                                -- AGGREGATE  |UNPARTITIONED|
+                                  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                    -- AGGREGATE  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$210][$$209]  
|PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$210] 
 |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                  -- HYBRID_HASH_JOIN 
[$$212][$$211]  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                      -- REPLICATE  
|PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$212]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                            -- STREAM_SELECT  
|PARTITIONED|
+                                                              -- ASSIGN  
|PARTITIONED|
+                                                                -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
DATASOURCE_SCAN (test.nation)  |PARTITIONED|
+                                                                      -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                      -- REPLICATE  
|PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$211]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                            -- ASSIGN  
|PARTITIONED|
+                                                              -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- 
DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                                                    -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$209] 
 |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- STREAM_PROJECT  
|PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                        -- REPLICATE  
|PARTITIONED|
+                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  
|PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.001.ddl.sqlpp
similarity index 51%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.001.ddl.sqlpp
index a9503378e6..b51e2a278f 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.001.ddl.sqlpp
@@ -16,31 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+-- Test merging components that only contain antimatter tuples
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
 
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
+USE test;
 
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
 
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
+CREATE TYPE OpenType AS {
+    myId: int
+};
 
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+CREATE DATASET ColumnDataset(OpenType)
+PRIMARY KEY myId WITH {
+    "storage-format": {"format" : "column"}
+};
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.002.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.002.update.sqlpp
new file mode 100644
index 0000000000..c7c9145358
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.002.update.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+-- Produce relatively large component
+UPSERT INTO ColumnDataset (
+    SELECT VALUE object_concat({"myId": gen_id},
+        {  "coordinates": {"coordinates": [1.1],"type": "string"  },  
"created_at": "string",  "entities": {"urls": [{  "display_url": "string",  
"expanded_url": "string",  "indices": [1],  "url": "string"}],"user_mentions": 
[{  "id": 1,  "id_str": "string",  "indices": [1],  "name": "string",  
"screen_name": "string"}]  },  "favorite_count": 1,  "favorited": true,  
"filter_level": "string",  "geo": {"coordinates": [1.1],"type": "string"  },  
"id": "0000000",  "id_str": "string",  "in_re [...]
+    )
+    FROM range(0, 29999) gen_id
+);
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.003.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.003.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.003.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.004.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.004.update.sqlpp
index a9503378e6..66986385d5 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.004.update.sqlpp
@@ -16,31 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- Delete 1 record and flush
+DELETE FROM ColumnDataset c
+WHERE c.myId < 1
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.005.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.005.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.005.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.006.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.006.update.sqlpp
index a9503378e6..5f09d5a4a5 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.006.update.sqlpp
@@ -16,31 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- Delete 1 record and flush
+DELETE FROM ColumnDataset c
+WHERE c.myId < 2
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.007.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.007.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.007.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.008.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.008.update.sqlpp
index a9503378e6..2d4da3d7a5 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.008.update.sqlpp
@@ -16,31 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- Delete 1 record and flush. This should trigger a merge against the 
antimatter's components
+DELETE FROM ColumnDataset c
+WHERE c.myId < 3
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.009.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.009.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.009.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.010.sleep.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.010.sleep.sqlpp
index a9503378e6..e50b429c07 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.010.sleep.sqlpp
@@ -16,31 +16,5 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+2000
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.011.query.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.011.query.sqlpp
index a9503378e6..d52cd6c807 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.011.query.sqlpp
@@ -16,31 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+SELECT VALUE COUNT(*)
+FROM ColumnDataset c
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.012.query.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.012.query.sqlpp
index a9503378e6..cb9f7f69a9 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/003/003.012.query.sqlpp
@@ -16,31 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+SELECT VALUE COUNT(*)
+FROM ColumnDataset c
+WHERE c.myId < 3
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.001.ddl.sqlpp
similarity index 51%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.001.ddl.sqlpp
index a9503378e6..3bc296621b 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.001.ddl.sqlpp
@@ -16,31 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+-- Test merging components that only contain antimatter tuples
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
 
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
+USE test;
 
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
 
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
+CREATE TYPE OpenType AS {
+    id: int
+};
 
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+CREATE DATASET ColumnDataset(OpenType)
+PRIMARY KEY id WITH {
+    "storage-format": {"format" : "column"}
+};
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.002.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.002.update.sqlpp
index a9503378e6..39572a3956 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.002.update.sqlpp
@@ -16,31 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+INSERT INTO ColumnDataset (
+    {"id": 1, "geo" : {"coordinates": [1, 2]}},
+    {"id": 2, "geo" : {"coordinates": [3, 4]}},
+    {"id": 3, "geo" : {"coordinates": [5, 6]}},
+    {"id": 4, "geo" : {"coordinates": [7, 8]}}
+);
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.003.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.003.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.003.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.004.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.004.update.sqlpp
index a9503378e6..c850a84ee3 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.004.update.sqlpp
@@ -16,31 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- delete all records
+DELETE FROM ColumnDataset c
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.005.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.005.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.005.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.006.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.006.update.sqlpp
index a9503378e6..d82b5d04f2 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.006.update.sqlpp
@@ -16,31 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- Compact to get an empty component
+COMPACT DATASET ColumnDataset;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.007.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.007.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.007.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.008.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.008.update.sqlpp
index a9503378e6..c334562f85 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.008.update.sqlpp
@@ -16,31 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+-- Insert new records and then flush
+INSERT INTO ColumnDataset (
+    {"id": 1, "geo" : {"coordinates": [1, 2]}},
+    {"id": 2, "geo" : {"coordinates": [3, 4]}},
+    {"id": 3, "geo" : {"coordinates": [5, 6]}},
+    {"id": 4, "geo" : {"coordinates": [7, 8]}}
+);
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.009.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.009.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.009.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.010.update.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.010.update.sqlpp
index a9503378e6..1479603dfe 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.010.update.sqlpp
@@ -16,31 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+USE test;
+-- Compact empty component with filled component
+COMPACT DATASET ColumnDataset;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.011.get.http
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.011.get.http
index a9503378e6..57d830aed0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.011.get.http
@@ -16,31 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
-
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
-
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.012.query.sqlpp
similarity index 50%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.012.query.sqlpp
index a9503378e6..e62ac125b9 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/delete/004/004.012.query.sqlpp
@@ -16,31 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+USE test;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
-
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
-    }
-
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
-    }
-
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
-    }
-
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
-}
+SELECT VALUE c
+FROM ColumnDataset c
+ORDER BY c.id
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.003.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.003.regexadm
new file mode 100644
index 0000000000..16c1eaf68b
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.003.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"myId","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"myId":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.005.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.005.regexadm
new file mode 100644
index 0000000000..16c1eaf68b
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.005.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"myId","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"myId":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.007.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.007.regexadm
new file mode 100644
index 0000000000..16c1eaf68b
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.007.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"myId","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"myId":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.009.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.009.regexadm
new file mode 100644
index 0000000000..16c1eaf68b
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.009.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"myId","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"myId":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.011.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.011.adm
new file mode 100644
index 0000000000..414c6bb761
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.011.adm
@@ -0,0 +1 @@
+29997
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.012.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.012.adm
new file mode 100644
index 0000000000..c227083464
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/003/003.012.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.003.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.003.regexadm
new file mode 100644
index 0000000000..9f1dc3ae17
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.003.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.005.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.005.regexadm
new file mode 100644
index 0000000000..9f1dc3ae17
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.005.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.007.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.007.regexadm
new file mode 100644
index 0000000000..9f1dc3ae17
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.007.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.009.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.009.regexadm
new file mode 100644
index 0000000000..9f1dc3ae17
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.009.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.011.regexadm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.011.regexadm
new file mode 100644
index 0000000000..9f1dc3ae17
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.011.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OpenType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.012.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.012.adm
new file mode 100644
index 0000000000..83bc984143
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/delete/004/004.012.adm
@@ -0,0 +1,4 @@
+{ "id": 1, "geo": { "coordinates": [ 1, 2 ] } }
+{ "id": 2, "geo": { "coordinates": [ 3, 4 ] } }
+{ "id": 3, "geo": { "coordinates": [ 5, 6 ] } }
+{ "id": 4, "geo": { "coordinates": [ 7, 8 ] } }
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
new file mode 100644
index 0000000000..dbc5a1f8da
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" 
ResultOffsetPath="results" QueryOffsetPath="queries_sqlpp" 
QueryFileExtension=".sqlpp">
+  <test-group name="column">
+    <test-case FilePath="column">
+      <compilation-unit name="delete/003">
+        <output-dir compare="Text">delete/003</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="delete/004">
+        <output-dir compare="Text">delete/004</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index af7198611b..059bc6234e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -16121,6 +16121,16 @@
         <output-dir compare="Text">delete/002</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="delete/003">
+        <output-dir compare="Text">delete/003</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="delete/004">
+        <output-dir compare="Text">delete/004</output-dir>
+      </compilation-unit>
+    </test-case>
     <test-case FilePath="column">
       <compilation-unit name="meta/meta_after_gby">
         <output-dir compare="Text">meta/meta_after_gby</output-dir>
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
index a9503378e6..ccdd950d97 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
@@ -18,6 +18,10 @@
  */
 package org.apache.asterix.column.assembler;
 
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AssemblerState {
     private EndOfRepeatedGroupAssembler currentGroup;
 
@@ -43,4 +47,14 @@ public class AssemblerState {
     public boolean isInGroup() {
         return currentGroup != null;
     }
+
+    public void appendStateInfo(ColumnarValueException e) {
+        ObjectNode stateNode = e.createNode(getClass().getSimpleName());
+        if (isInGroup()) {
+            stateNode.put("inGroup", true);
+            
currentGroup.reader.appendReaderInformation(stateNode.putObject("endOfGroupReader"));
+        } else {
+            stateNode.put("inGroup", false);
+        }
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
index eb88778d8c..8dcf024d64 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
@@ -21,8 +21,12 @@ package org.apache.asterix.column.assembler;
 import org.apache.asterix.column.assembler.value.IValueGetter;
 import org.apache.asterix.column.values.IColumnValuesReader;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class PrimitiveValueAssembler extends AbstractPrimitiveValueAssembler {
+    int counter = 0;
 
     PrimitiveValueAssembler(int level, AssemblerInfo info, IColumnValuesReader 
reader, IValueGetter primitiveValue) {
         super(level, info, reader, primitiveValue);
@@ -31,7 +35,7 @@ public class PrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
     @Override
     public int next(AssemblerState state) throws HyracksDataException {
         if (!reader.next()) {
-            throw new IllegalStateException("no more values, column index: " + 
getColumnIndex());
+            throw createException();
         } else if (reader.isNull() && (isDelegate() || reader.getLevel() + 1 
== level)) {
             addNullToAncestor(reader.getLevel());
         } else if (reader.isValue()) {
@@ -44,4 +48,16 @@ public class PrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
         //Go to next value
         return -1;
     }
+
+    private ColumnarValueException createException() {
+        ColumnarValueException e = new ColumnarValueException();
+
+        ObjectNode assemblerNode = e.createNode(getClass().getSimpleName());
+        assemblerNode.put("isDelegate", isDelegate());
+
+        ObjectNode readerNode = assemblerNode.putObject("assemblerReader");
+        reader.appendReaderInformation(readerNode);
+
+        return e;
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
index a10fc61e54..6588972a6a 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
@@ -21,6 +21,9 @@ package org.apache.asterix.column.assembler;
 import org.apache.asterix.column.assembler.value.IValueGetter;
 import org.apache.asterix.column.values.IColumnValuesReader;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 class RepeatedPrimitiveValueAssembler extends AbstractPrimitiveValueAssembler {
     private boolean arrayDelegate;
@@ -63,7 +66,7 @@ class RepeatedPrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
 
     private void next() throws HyracksDataException {
         if (!reader.next()) {
-            throw new IllegalStateException("no more values, column index: " + 
getColumnIndex());
+            throw createException();
         } else if (reader.isNull() && (arrayDelegate || reader.getLevel() + 1 
== level)) {
             /*
              * There are two cases here for where the null belongs to:
@@ -81,4 +84,16 @@ class RepeatedPrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
             addValueToParent();
         }
     }
+
+    private ColumnarValueException createException() {
+        ColumnarValueException e = new ColumnarValueException();
+        ObjectNode assemblerNode = e.createNode(getClass().getSimpleName());
+        assemblerNode.put("isDelegate", isDelegate());
+        assemblerNode.put("isArrayDelegate", arrayDelegate);
+
+        ObjectNode readerNode = assemblerNode.putObject("assemblerReader");
+        reader.appendReaderInformation(readerNode);
+
+        return e;
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
index 41a8263e59..dfd7d6f830 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
@@ -34,6 +34,9 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleWriter;
 import org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnTupleIterator;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnWriteMultiPageOp;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class MergeColumnTupleWriter extends AbstractColumnTupleWriter {
     private final MergeColumnWriteMetadata columnMetadata;
@@ -45,6 +48,7 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
     private final ColumnBatchWriter writer;
     private final int maxNumberOfTuples;
     private int primaryKeysEstimatedSize;
+    private int numberOfAntiMatter;
 
     public MergeColumnTupleWriter(MergeColumnWriteMetadata columnMetadata, int 
pageSize, int maxNumberOfTuples,
             double tolerance) {
@@ -66,6 +70,7 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
             primaryKeyWriters[i] = columnMetadata.getWriter(i);
         }
         orderedColumns = new PriorityQueue<>(Comparator.comparingInt(x -> 
-x.getEstimatedSize()));
+        numberOfAntiMatter = 0;
     }
 
     @Override
@@ -103,19 +108,48 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
     @Override
     public void writeTuple(ITupleReference tuple) throws HyracksDataException {
         MergeColumnTupleReference columnTuple = (MergeColumnTupleReference) 
tuple;
+        // +1 to avoid having -0, where the '-' is an antimatter indicator
         int componentIndex = columnTuple.getComponentIndex();
         int skipCount = columnTuple.getAndResetSkipCount();
         if (skipCount > 0) {
-            writtenComponents.add(-componentIndex, skipCount);
+            writtenComponents.add(setAntimatterIndicator(componentIndex), 
skipCount);
         }
-        if (columnTuple.isAntimatter()) {
-            writtenComponents.add(-componentIndex);
-        } else {
+
+        if (!columnTuple.isAntimatter()) {
+            // anti matters contain only the primary keys, and none of the 
other columns
             writtenComponents.add(componentIndex);
+        } else {
+            // counter for logging purposes
+            numberOfAntiMatter++;
         }
+
         writePrimaryKeys(columnTuple);
     }
 
+    @Override
+    public int flush(ByteBuffer pageZero) throws HyracksDataException {
+        int numberOfColumns = columnMetadata.getNumberOfColumns();
+        int numberOfPrimaryKeys = columnMetadata.getNumberOfPrimaryKeys();
+        if (writtenComponents.getSize() > 0) {
+            writeNonKeyColumns();
+            writtenComponents.reset();
+        }
+        for (int i = numberOfPrimaryKeys; i < numberOfColumns; i++) {
+            orderedColumns.add(columnMetadata.getWriter(i));
+        }
+        writer.setPageZeroBuffer(pageZero, numberOfColumns, 
numberOfPrimaryKeys);
+        int allocatedSpace = writer.writePrimaryKeyColumns(primaryKeyWriters);
+        allocatedSpace += writer.writeColumns(orderedColumns);
+
+        numberOfAntiMatter = 0;
+        return allocatedSpace;
+    }
+
+    @Override
+    public void close() {
+        columnMetadata.close();
+    }
+
     private void writePrimaryKeys(MergeColumnTupleReference columnTuple) 
throws HyracksDataException {
         int primaryKeySize = 0;
         for (int i = 0; i < columnMetadata.getNumberOfPrimaryKeys(); i++) {
@@ -132,7 +166,7 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
             int componentIndex = writtenComponents.getBlockValue(i);
             if (componentIndex < 0) {
                 //Skip writing values of deleted tuples
-                componentIndex = -componentIndex;
+                componentIndex = clearAntimatterIndicator(componentIndex);
                 skipReaders(componentIndex, writtenComponents.getBlockSize(i));
                 continue;
             }
@@ -141,11 +175,27 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
             for (int j = columnMetadata.getNumberOfPrimaryKeys(); j < 
columnMetadata.getNumberOfColumns(); j++) {
                 IColumnValuesReader columnReader = componentTuple.getReader(j);
                 IColumnValuesWriter columnWriter = columnMetadata.getWriter(j);
-                columnReader.write(columnWriter, count);
+                writeColumn(i, componentIndex, columnReader, columnWriter, 
count);
             }
         }
     }
 
+    private void writeColumn(int blockIndex, int componentIndex, 
IColumnValuesReader columnReader,
+            IColumnValuesWriter columnWriter, int count) throws 
HyracksDataException {
+        try {
+            columnReader.write(columnWriter, count);
+        } catch (ColumnarValueException e) {
+            ObjectNode node = e.createNode(getClass().getSimpleName());
+            node.put("numberOfWrittenPrimaryKeys", 
primaryKeyWriters[0].getCount());
+            node.put("writtenComponents", writtenComponents.toString());
+            node.put("blockIndex", blockIndex);
+            node.put("componentIndex", componentIndex);
+            node.put("count", count);
+            node.put("numberOFAntiMatters", numberOfAntiMatter);
+            throw e;
+        }
+    }
+
     private void skipReaders(int componentIndex, int count) throws 
HyracksDataException {
         MergeColumnTupleReference componentTuple = 
componentsTuples[componentIndex];
         for (int j = columnMetadata.getNumberOfPrimaryKeys(); j < 
columnMetadata.getNumberOfColumns(); j++) {
@@ -154,28 +204,6 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
         }
     }
 
-    @Override
-    public int flush(ByteBuffer pageZero) throws HyracksDataException {
-        int numberOfColumns = columnMetadata.getNumberOfColumns();
-        int numberOfPrimaryKeys = columnMetadata.getNumberOfPrimaryKeys();
-        if (writtenComponents.getSize() > 0) {
-            writeNonKeyColumns();
-            writtenComponents.reset();
-        }
-        for (int i = numberOfPrimaryKeys; i < numberOfColumns; i++) {
-            orderedColumns.add(columnMetadata.getWriter(i));
-        }
-        writer.setPageZeroBuffer(pageZero, numberOfColumns, 
numberOfPrimaryKeys);
-        int allocatedSpace = writer.writePrimaryKeyColumns(primaryKeyWriters);
-        allocatedSpace += writer.writeColumns(orderedColumns);
-        return allocatedSpace;
-    }
-
-    @Override
-    public void close() {
-        columnMetadata.close();
-    }
-
     private void writeAllColumns(MergeColumnTupleReference columnTuple) throws 
HyracksDataException {
         /*
          * The last tuple from one of the components was reached. Since we are 
going to the next leaf, we will not be
@@ -184,9 +212,18 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
          */
         int skipCount = columnTuple.getAndResetSkipCount();
         if (skipCount > 0) {
-            writtenComponents.add(-columnTuple.getComponentIndex(), skipCount);
+            
writtenComponents.add(setAntimatterIndicator(columnTuple.getComponentIndex()), 
skipCount);
         }
         writeNonKeyColumns();
         writtenComponents.reset();
     }
+
+    private static int setAntimatterIndicator(int componentIndex) {
+        // This is to avoid -0, where the '-' is the antimatter indicator
+        return -(componentIndex + 1);
+    }
+
+    private static int clearAntimatterIndicator(int componentIndex) {
+        return -componentIndex - 1;
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
index 23a78565e1..30d01d5346 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
@@ -29,6 +29,9 @@ import 
org.apache.asterix.column.values.IColumnValuesReaderFactory;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public final class ColumnAssembler {
     private final AbstractPrimitiveValueAssembler[] assemblers;
@@ -36,6 +39,7 @@ public final class ColumnAssembler {
     private final AssemblerState state;
     private int numberOfTuples;
     private int tupleIndex;
+    private int numberOfSkips;
 
     public ColumnAssembler(AbstractSchemaNode node, ARecordType declaredType, 
QueryColumnMetadata columnMetadata,
             IColumnValuesReaderFactory readerFactory, IValueGetterFactory 
valueGetterFactory)
@@ -50,6 +54,7 @@ public final class ColumnAssembler {
     public void reset(int numberOfTuples) {
         this.numberOfTuples = numberOfTuples;
         tupleIndex = 0;
+        numberOfSkips = 0;
     }
 
     public void resetColumn(AbstractBytesInputStream stream, int ordinal) 
throws HyracksDataException {
@@ -75,7 +80,15 @@ public final class ColumnAssembler {
         int index = 0;
         while (index < assemblers.length) {
             AbstractPrimitiveValueAssembler assembler = assemblers[index];
-            int groupIndex = assembler.next(state);
+            int groupIndex;
+
+            try {
+                groupIndex = assembler.next(state);
+            } catch (ColumnarValueException e) {
+                appendInformation(e);
+                throw e;
+            }
+
             if (groupIndex != AbstractPrimitiveValueAssembler.NEXT_ASSEMBLER) {
                 index = groupIndex;
             } else {
@@ -93,6 +106,7 @@ public final class ColumnAssembler {
     }
 
     public int skip(int count) throws HyracksDataException {
+        numberOfSkips += count;
         tupleIndex += count;
         for (int i = 0; i < assemblers.length; i++) {
             assemblers[i].skip(count);
@@ -103,4 +117,12 @@ public final class ColumnAssembler {
     public void setAt(int index) throws HyracksDataException {
         skip(index - tupleIndex);
     }
+
+    private void appendInformation(ColumnarValueException e) {
+        ObjectNode assemblerNode = e.createNode(getClass().getSimpleName());
+        assemblerNode.put("tupleIndex", tupleIndex);
+        assemblerNode.put("numberOfTuples", numberOfTuples);
+        assemblerNode.put("numberOfSkips", numberOfSkips);
+        state.appendStateInfo(e);
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
index 77bf945021..97cc740b91 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
@@ -218,21 +218,18 @@ public class QueryColumnMetadata extends 
AbstractColumnImmutableReadMetadata {
             filterAccessorProvider.reset();
             columnFilterEvaluator = 
columnFilterEvaluatorFactory.create(filterAccessorProvider, evaluatorContext);
             filterColumnReaders = 
filterAccessorProvider.getFilterColumnReaders();
-        }
-
-        // Primary key readers
-        PrimitiveColumnValuesReader[] primaryKeyReaders =
-                createPrimaryKeyReaders(input, readerFactory, 
numberOfPrimaryKeys);
 
-        if (LOGGER.isInfoEnabled() && normalizedFilterEvaluator != 
TrueColumnFilterEvaluator.INSTANCE) {
-            String filterString = normalizedFilterEvaluator == 
FalseColumnFilterEvaluator.INSTANCE ? "SKIP_ALL"
-                    : 
LogRedactionUtil.userData(normalizedEvaluatorFactory.toString());
-            LOGGER.info("Filter: {}", filterString);
         }
 
+        // log normalized filter
+        logFilter(normalizedFilterEvaluator, 
normalizedEvaluatorFactory.toString());
         // log requested schema
         logSchema(clippedRoot, SchemaStringBuilderVisitor.RECORD_SCHEMA, 
fieldNamesDictionary);
 
+        // Primary key readers
+        PrimitiveColumnValuesReader[] primaryKeyReaders =
+                createPrimaryKeyReaders(input, readerFactory, 
numberOfPrimaryKeys);
+
         return new QueryColumnMetadata(datasetType, null, primaryKeyReaders, 
serializedMetadata, fieldNamesDictionary,
                 clippedRoot, readerFactory, valueGetterFactory, 
normalizedFilterEvaluator, filterValueAccessors,
                 columnFilterEvaluator, filterColumnReaders);
@@ -261,6 +258,14 @@ public class QueryColumnMetadata extends 
AbstractColumnImmutableReadMetadata {
         return primaryKeyReaders;
     }
 
+    protected static void logFilter(IColumnFilterEvaluator 
normalizedFilterEvaluator, String filterExpression) {
+        if (LOGGER.isInfoEnabled() && normalizedFilterEvaluator != 
TrueColumnFilterEvaluator.INSTANCE) {
+            String filterString = normalizedFilterEvaluator == 
FalseColumnFilterEvaluator.INSTANCE ? "SKIP_ALL"
+                    : LogRedactionUtil.userData(filterExpression);
+            LOGGER.info("Filter: {}", filterString);
+        }
+    }
+
     protected static void logSchema(ObjectSchemaNode root, String schemaSource,
             FieldNamesDictionary fieldNamesDictionary) throws 
HyracksDataException {
         if (LOGGER.isInfoEnabled()) {
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
index e63358ba46..c23dbcf6f1 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
@@ -170,15 +170,17 @@ public final class QueryColumnWithMetaMetadata extends 
QueryColumnMetadata {
             filterColumnReaders = 
filterAccessorProvider.getFilterColumnReaders();
         }
 
-        // Primary key readers
-        PrimitiveColumnValuesReader[] primaryKeyReaders =
-                createPrimaryKeyReaders(input, readerFactory, 
numberOfPrimaryKeys);
-
+        // log normalized filter
+        logFilter(normalizedFilterEvaluator, 
normalizedEvaluatorFactory.toString());
         // log requested schema for record
         logSchema(clippedRoot, SchemaStringBuilderVisitor.RECORD_SCHEMA, 
fieldNamesDictionary);
         // log requested schema for meta-record
         logSchema(metaClippedRoot, 
SchemaStringBuilderVisitor.META_RECORD_SCHEMA, fieldNamesDictionary);
 
+        // Primary key readers
+        PrimitiveColumnValuesReader[] primaryKeyReaders =
+                createPrimaryKeyReaders(input, readerFactory, 
numberOfPrimaryKeys);
+
         return new QueryColumnWithMetaMetadata(datasetType, metaType, 
primaryKeyReaders, serializedMetadata,
                 fieldNamesDictionary, clippedRoot, metaClippedRoot, 
readerFactory, valueGetterFactory,
                 normalizedFilterEvaluator, filterValueAccessors, 
columnFilterEvaluator, filterColumnReaders);
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/MergeColumnTupleReference.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/MergeColumnTupleReference.java
index 61030e14b4..7657009238 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/MergeColumnTupleReference.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/MergeColumnTupleReference.java
@@ -33,6 +33,8 @@ import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.IColumnProj
 import 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.ColumnBTreeReadLeafFrame;
 
 public final class MergeColumnTupleReference extends 
AbstractAsterixColumnTupleReference {
+    // NoOP callback is for empty pages only
+    private static final IEndOfPageCallBack EMPTY_PAGE_CALLBACK = 
createNoOpCallBack();
     private final IColumnValuesReader[] columnReaders;
     private int skipCount;
     private IEndOfPageCallBack endOfPageCallBack;
@@ -41,6 +43,7 @@ public final class MergeColumnTupleReference extends 
AbstractAsterixColumnTupleR
             MergeColumnReadMetadata columnMetadata, IColumnReadMultiPageOp 
multiPageOp) {
         super(componentIndex, frame, columnMetadata, multiPageOp);
         this.columnReaders = columnMetadata.getColumnReaders();
+        endOfPageCallBack = EMPTY_PAGE_CALLBACK;
     }
 
     @Override
@@ -112,4 +115,14 @@ public final class MergeColumnTupleReference extends 
AbstractAsterixColumnTupleR
     public void registerEndOfPageCallBack(IEndOfPageCallBack 
endOfPageCallBack) {
         this.endOfPageCallBack = endOfPageCallBack;
     }
+
+    private static IEndOfPageCallBack createNoOpCallBack() {
+        return columnTuple -> {
+            if (!columnTuple.isEmpty()) {
+                // safeguard against unset proper call back for non-empty pages
+                throw new NullPointerException("endOfPageCallBack is null");
+            }
+        };
+    }
+
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
index 7ec6e8a914..fcb21c0700 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
@@ -23,6 +23,8 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public interface IColumnValuesReader extends Comparable<IColumnValuesReader> {
     /**
      * Reset the reader
@@ -139,4 +141,11 @@ public interface IColumnValuesReader extends 
Comparable<IColumnValuesReader> {
      * @param count the number of values should be skipped
      */
     void skip(int count) throws HyracksDataException;
+
+    /**
+     * Appends readers information for debugging
+     *
+     * @param node container for the reader's information
+     */
+    void appendReaderInformation(ObjectNode node);
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
index 41dfea2908..7fd206a73e 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
@@ -33,6 +33,8 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
 import org.apache.parquet.bytes.BytesUtils;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 abstract class AbstractColumnValuesReader implements IColumnValuesReader {
     protected final AbstractValueReader valueReader;
     protected final int columnIndex;
@@ -47,6 +49,10 @@ abstract class AbstractColumnValuesReader implements 
IColumnValuesReader {
     private boolean nullLevel;
     private boolean allMissing;
 
+    // Logging members
+    private int numberOfEncounteredMissing;
+    private int numberOfEncounteredNull;
+
     AbstractColumnValuesReader(AbstractValueReader valueReader, int 
columnIndex, int maxLevel, boolean primaryKey) {
         this.valueReader = valueReader;
         this.columnIndex = columnIndex;
@@ -61,15 +67,13 @@ abstract class AbstractColumnValuesReader implements 
IColumnValuesReader {
         }
 
         valueIndex++;
-        try {
-            int actualLevel = definitionLevels.readInt();
-            //Check whether the level is for a null value
-            nullLevel = ColumnValuesUtil.isNull(nullBitMask, actualLevel);
-            //Clear the null bit to allow repeated value readers determine the 
correct delimiter for null values
-            level = ColumnValuesUtil.clearNullBit(nullBitMask, actualLevel);
-        } catch (IOException e) {
-            throw HyracksDataException.create(e);
-        }
+        int actualLevel = definitionLevels.readInt();
+        //Check whether the level is for a null value
+        nullLevel = ColumnValuesUtil.isNull(nullBitMask, actualLevel);
+        //Clear the null bit to allow repeated value readers determine the 
correct delimiter for null values
+        level = ColumnValuesUtil.clearNullBit(nullBitMask, actualLevel);
+        numberOfEncounteredMissing += isMissing() ? 1 : 0;
+        numberOfEncounteredNull += isNull() ? 1 : 0;
     }
 
     abstract void resetValues();
@@ -77,6 +81,8 @@ abstract class AbstractColumnValuesReader implements 
IColumnValuesReader {
     @Override
     public final void reset(AbstractBytesInputStream in, int tupleCount) 
throws HyracksDataException {
         valueIndex = 0;
+        numberOfEncounteredMissing = 0;
+        numberOfEncounteredNull = 0;
         if (in.available() == 0) {
             allMissing = true;
             level = 0;
@@ -168,4 +174,17 @@ abstract class AbstractColumnValuesReader implements 
IColumnValuesReader {
             next();
         }
     }
+
+    protected void appendCommon(ObjectNode node) {
+        node.put("typeTag", getTypeTag().toString());
+        node.put("columnIndex", columnIndex);
+        node.put("valueIndex", valueIndex);
+        node.put("valueCount", valueCount);
+        node.put("allMissing", allMissing);
+        node.put("level", level);
+        node.put("maxLevel", maxLevel);
+        node.put("nullBitMask", nullBitMask);
+        node.put("numberOfEncounteredMissing", numberOfEncounteredMissing);
+        node.put("numberOfEncounteredNull", numberOfEncounteredNull);
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
index 8fdf1b597f..c6d2b1ef06 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
@@ -25,6 +25,9 @@ import org.apache.asterix.column.values.IColumnValuesWriter;
 import org.apache.asterix.column.values.reader.value.AbstractValueReader;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 /**
  * Reader for a non-repeated primitive value
@@ -52,13 +55,9 @@ public final class PrimitiveColumnValuesReader extends 
AbstractColumnValuesReade
             return false;
         }
 
-        try {
-            nextLevel();
-            if (primaryKey || level == maxLevel) {
-                valueReader.nextValue();
-            }
-        } catch (IOException e) {
-            throw HyracksDataException.create(e);
+        nextLevel();
+        if (primaryKey || level == maxLevel) {
+            valueReader.nextValue();
         }
         return true;
     }
@@ -96,7 +95,9 @@ public final class PrimitiveColumnValuesReader extends 
AbstractColumnValuesReade
     @Override
     public void write(IColumnValuesWriter writer, boolean callNext) throws 
HyracksDataException {
         if (callNext && !next()) {
-            throw new IllegalStateException("No more values");
+            ColumnarValueException e = new ColumnarValueException();
+            appendReaderInformation(e.createNode(getClass().getSimpleName()));
+            throw e;
         }
 
         writer.writeLevel(level);
@@ -122,4 +123,11 @@ public final class PrimitiveColumnValuesReader extends 
AbstractColumnValuesReade
             nextLevel();
         }
     }
+
+    @Override
+    public void appendReaderInformation(ObjectNode node) {
+        appendCommon(node);
+        node.put("isPrimaryKeyColumn", primaryKey);
+    }
+
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
index 9848878cc3..4f9fdec966 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
@@ -19,11 +19,15 @@
 package org.apache.asterix.column.values.reader;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.apache.asterix.column.values.IColumnValuesWriter;
 import org.apache.asterix.column.values.reader.value.AbstractValueReader;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 /**
  * For primitive values that belong to an {@link ATypeTag#ARRAY} and {@link 
ATypeTag#MULTISET}
@@ -93,7 +97,9 @@ public final class RepeatedPrimitiveColumnValuesReader 
extends AbstractColumnVal
     public void write(IColumnValuesWriter writer, boolean callNext) throws 
HyracksDataException {
         //We always call next as repeated values cannot be primary keys
         if (!next()) {
-            throw new IllegalStateException("No more values");
+            ColumnarValueException e = new ColumnarValueException();
+            appendReaderInformation(e.createNode(getClass().getSimpleName()));
+            throw e;
         }
 
         if (isRepeatedValue()) {
@@ -123,6 +129,18 @@ public final class RepeatedPrimitiveColumnValuesReader 
extends AbstractColumnVal
         return isDelimiter() && delimiterIndex == delimiters.length - 1;
     }
 
+    @Override
+    public void skip(int count) throws HyracksDataException {
+        for (int i = 0; i < count; i++) {
+            next();
+            if (isRepeatedValue()) {
+                while (!isLastDelimiter()) {
+                    next();
+                }
+            }
+        }
+    }
+
     private void consumeDelimiterIfAny() {
         if (isDelimiter()) {
             delimiterIndex++;
@@ -137,14 +155,11 @@ public final class RepeatedPrimitiveColumnValuesReader 
extends AbstractColumnVal
     }
 
     @Override
-    public void skip(int count) throws HyracksDataException {
-        for (int i = 0; i < count; i++) {
-            next();
-            if (isRepeatedValue()) {
-                while (!isLastDelimiter()) {
-                    next();
-                }
-            }
-        }
+    public void appendReaderInformation(ObjectNode node) {
+        appendCommon(node);
+        node.put("delimiters", Arrays.toString(delimiters));
+        node.put("levelToDelimiterMap", Arrays.toString(levelToDelimiterMap));
+        node.put("delimiterIndex", delimiterIndex);
+        node.put("isDelimiter", isDelimiter());
     }
 }
diff --git 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
index 51c360ade7..a3c6984f50 100644
--- 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
+++ 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
@@ -29,6 +29,8 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public abstract class AbstractDummyColumnValuesReader implements 
IColumnValuesReader {
     private final ATypeTag typeTag;
     protected final int columnIndex;
@@ -154,4 +156,12 @@ public abstract class AbstractDummyColumnValuesReader 
implements IColumnValuesRe
             next();
         }
     }
+
+    protected void appendCommon(ObjectNode node) {
+        node.put("columnIndex", columnIndex);
+        node.put("valueIndex", valueIndex);
+        node.put("valueCount", valueCount);
+        node.put("level", level);
+        node.put("maxLevel", maxLevel);
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyPrimitiveColumnValueReader.java
 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyPrimitiveColumnValueReader.java
index f888db4a6f..6410daa90e 100644
--- 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyPrimitiveColumnValueReader.java
+++ 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyPrimitiveColumnValueReader.java
@@ -25,6 +25,8 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class DummyPrimitiveColumnValueReader extends 
AbstractDummyColumnValuesReader {
     DummyPrimitiveColumnValueReader(ATypeTag typeTag, RunLengthIntArray 
defLevels, List<IValueReference> values,
             int columnIndex, int maxLevel) {
@@ -73,4 +75,10 @@ public class DummyPrimitiveColumnValueReader extends 
AbstractDummyColumnValuesRe
     public int getNumberOfDelimiters() {
         return 0;
     }
+
+    @Override
+    public void appendReaderInformation(ObjectNode node) {
+        appendCommon(node);
+        node.put("isPrimaryKeyColumn", false);
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyRepeatedPrimitiveColumnValueReader.java
 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyRepeatedPrimitiveColumnValueReader.java
index 06c94c3d90..d9ae969369 100644
--- 
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyRepeatedPrimitiveColumnValueReader.java
+++ 
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/DummyRepeatedPrimitiveColumnValueReader.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.column.values.reader;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.asterix.column.util.RunLengthIntArray;
@@ -25,6 +26,8 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IValueReference;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class DummyRepeatedPrimitiveColumnValueReader extends 
AbstractDummyColumnValuesReader {
     private final int[] delimiters;
     private final int[] levelToDelimiterMap;
@@ -104,4 +107,13 @@ public class DummyRepeatedPrimitiveColumnValueReader 
extends AbstractDummyColumn
         }
         delimiterIndex = levelToDelimiterMap[level];
     }
+
+    @Override
+    public void appendReaderInformation(ObjectNode node) {
+        appendCommon(node);
+        node.put("delimiters", Arrays.toString(delimiters));
+        node.put("levelToDelimiterMap", Arrays.toString(levelToDelimiterMap));
+        node.put("delimiterIndex", delimiterIndex);
+        node.put("isDelimiter", isDelimiter());
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/error/ColumnarValueException.java
similarity index 53%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
copy to 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/error/ColumnarValueException.java
index a9503378e6..476e1a1e8a 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerState.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/error/ColumnarValueException.java
@@ -16,31 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.assembler;
+package org.apache.hyracks.storage.am.lsm.btree.column.error;
 
-public class AssemblerState {
-    private EndOfRepeatedGroupAssembler currentGroup;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
-    public AssemblerState() {
-        // Initially, not in a group
-        currentGroup = null;
-    }
+/**
+ * This exception is thrown when an error is encountered in columnar 
collections
+ * It contains a string builder to collect information about the encountered 
error
+ */
+public class ColumnarValueException extends IllegalStateException {
+    private static final long serialVersionUID = 1513428477557736034L;
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private final ObjectNode node;
 
-    public EndOfRepeatedGroupAssembler 
enterRepeatedGroup(EndOfRepeatedGroupAssembler newGroup) {
-        EndOfRepeatedGroupAssembler previousGroup = currentGroup;
-        currentGroup = newGroup;
-        return previousGroup;
+    @Override
+    public String getMessage() {
+        return node.toString();
     }
 
-    public boolean isCurrentGroup(EndOfRepeatedGroupAssembler group) {
-        return currentGroup == group;
+    public ColumnarValueException() {
+        node = OBJECT_MAPPER.createObjectNode();
     }
 
-    public void exitRepeatedGroup(EndOfRepeatedGroupAssembler previousGroup) {
-        currentGroup = previousGroup;
+    public ObjectNode createNode(String fieldName) {
+        return node.putObject(fieldName);
     }
 
-    public boolean isInGroup() {
-        return currentGroup != null;
-    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/lsm/tuples/AbstractColumnTupleReference.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/lsm/tuples/AbstractColumnTupleReference.java
index 310b0b6dd5..d3b4673267 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/lsm/tuples/AbstractColumnTupleReference.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/lsm/tuples/AbstractColumnTupleReference.java
@@ -172,6 +172,10 @@ public abstract class AbstractColumnTupleReference 
implements IColumnTupleIterat
         return frame.getTupleCount();
     }
 
+    protected final boolean isEmpty() {
+        return frame.getTupleCount() == 0;
+    }
+
     @Override
     public final void next() throws HyracksDataException {
         onNext();

Reply via email to