diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExternalTableMetaData.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExternalTableMetaData.java index 7358bb78b..b8f6095dc 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExternalTableMetaData.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExternalTableMetaData.java @@ -31,6 +31,7 @@ public ExternalTableMetaData(String entityName, String dml, String[] dependents, String dataSourcePath, + String columnTableSorting, String driverClass) { this.entityName = entityName; this.schema = schema; @@ -44,6 +45,7 @@ public ExternalTableMetaData(String entityName, this.dependents = dependents; this.dataSourcePath = dataSourcePath; this.driverClass = driverClass; + this.columnTableSortOrder = columnTableSorting; } public String entityName; @@ -61,6 +63,7 @@ public ExternalTableMetaData(String entityName, public String shortProvider; public String dataSourcePath; public String driverClass; + public String columnTableSortOrder; public String viewText; // columns for metadata queries public List columns; diff --git a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/GfxdSerializable.java b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/GfxdSerializable.java index ea1eb3480..ce071fefd 100644 --- a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/GfxdSerializable.java +++ b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/GfxdSerializable.java @@ -333,4 +333,6 @@ public interface GfxdSerializable extends GfxdDSFID { byte COLUMN_FORMAT_DELTA = 115; byte COLUMN_DELETE_DELTA = 116; + + byte COLUMN_DELETE_CHANGE = 117; } diff --git a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/ddl/resolver/GfxdPartitionByExpressionResolver.java b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/ddl/resolver/GfxdPartitionByExpressionResolver.java index 19854aa4f..9d21b3181 100644 --- a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/ddl/resolver/GfxdPartitionByExpressionResolver.java +++ b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/ddl/resolver/GfxdPartitionByExpressionResolver.java @@ -449,6 +449,14 @@ public String[] getColumnNames() { return this.partitionColumnNames; } + /** + * Return the column positions (1-based) of partitioning columns + * in the table schema. + */ + public int[] getColumnPositions() { + return this.columnPositionsInRow; + } + @Override public int getPartitioningColumnIndex(String partitionColumn) { Integer idx = this.columnToIndexMap.get(partitionColumn); diff --git a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/distributed/metadata/UpdateQueryInfo.java b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/distributed/metadata/UpdateQueryInfo.java index a2e0fdf65..a52c1a931 100644 --- a/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/distributed/metadata/UpdateQueryInfo.java +++ b/gemfirexd/core/src/main/java/com/pivotal/gemfirexd/internal/engine/distributed/metadata/UpdateQueryInfo.java @@ -16,8 +16,10 @@ */ package com.pivotal.gemfirexd.internal.engine.distributed.metadata; +import com.gemstone.gemfire.internal.cache.ExternalTableMetaData; import com.gemstone.gemfire.internal.cache.LocalRegion; import com.pivotal.gemfirexd.internal.engine.distributed.utils.GemFireXDUtils; +import com.pivotal.gemfirexd.internal.engine.store.GemFireContainer; import com.pivotal.gemfirexd.internal.iapi.error.StandardException; import com.pivotal.gemfirexd.internal.iapi.reference.SQLState; import com.pivotal.gemfirexd.internal.iapi.services.io.FormatableBitSet; @@ -158,6 +160,26 @@ private void checkUpdateFormatSupported() throws StandardException { .clear(this.queryType, IS_PRIMARY_KEY_TYPE); checkForColumnConstr = false; } + + /** + * For sorted column batches allow delta insert that is implemented as update plan + * It is not necessary to check if its update vs insert since there will be no row in row buffer + */ + boolean isSortedColumnTable = false; + LocalRegion region = tqi.getRegion(); + if (region != null) { + GemFireContainer container = (GemFireContainer)region.getUserAttribute(); + if (container.isPartitioned()) { + ExternalTableMetaData md = container.fetchHiveMetaData(false); + if (md != null) { + isSortedColumnTable = md.columnTableSortOrder.equalsIgnoreCase("ASC") || + md.columnTableSortOrder.equalsIgnoreCase("Ascending") || + md.columnTableSortOrder.equalsIgnoreCase("DESC") || + md.columnTableSortOrder.equalsIgnoreCase("Descending"); + } + } + } + //ASIF: DISABLE FK Constraint check on query node //this.fcd = this.tableQueryInfoList.get(this.updateTargetTableNum).getForeignKeyConstraintDescriptorIfAny(); for (int i = 0; i < this.updateCols.length; ++i) { @@ -166,14 +188,14 @@ private void checkUpdateFormatSupported() throws StandardException { if (cqi.isTableInfoMissing()) { cqi.setMissingTableInfo(tqi); } - if (cqi.isUsedInPartitioning()) { + if (!isSortedColumnTable && cqi.isUsedInPartitioning()) { throw StandardException.newException(SQLState.NOT_IMPLEMENTED, "Update of partitioning column not supported"); } // For the time being since we are allowing only one table // the columns are necessarily part of the lone TableQueryInfo // Later the check needs to be more robust - if (cqi.isPartOfPrimaryKey(tqi.getPrimaryKeyColumns())) { + if (!isSortedColumnTable && cqi.isPartOfPrimaryKey(tqi.getPrimaryKeyColumns())) { throw StandardException .newException( SQLState.NOT_IMPLEMENTED,