You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by go...@apache.org on 2020/11/16 17:22:37 UTC

[phoenix] branch 4.x-PHOENIX-5923 updated: Revert "PHOENIX-6220 CREATE INDEX shouldn't ignore IMMUTABLE_STORAGE_SCHEME and COLUMN_ENDCODED_BYTES"

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

gokcen pushed a commit to branch 4.x-PHOENIX-5923
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x-PHOENIX-5923 by this push:
     new b0d23fc  Revert "PHOENIX-6220 CREATE INDEX shouldn't ignore IMMUTABLE_STORAGE_SCHEME and COLUMN_ENDCODED_BYTES"
b0d23fc is described below

commit b0d23fccc88aa4141096a0128c81bd5de5764314
Author: Gokcen Iskender <gi...@salesforce.com>
AuthorDate: Mon Nov 16 09:22:26 2020 -0800

    Revert "PHOENIX-6220 CREATE INDEX shouldn't ignore IMMUTABLE_STORAGE_SCHEME and COLUMN_ENDCODED_BYTES"
    
    This reverts commit a2cd0a13ae5b11a13306e7f6d023559bc3f3e49c.
---
 .../org/apache/phoenix/end2end/CreateTableIT.java  |  91 ------------------
 .../org/apache/phoenix/schema/MetaDataClient.java  | 104 ++++++---------------
 2 files changed, 28 insertions(+), 167 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
index c92be7c..4f6ccab 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
@@ -622,97 +622,6 @@ public class CreateTableIT extends ParallelStatsDisabledIT {
         }
     }
 
-    @Test
-    public void testCreateIndexWithDifferentStorageAndEncoding() throws Exception {
-        verifyIndexSchemeChange(false, false);
-        verifyIndexSchemeChange(false, true);
-        verifyIndexSchemeChange(true, false);
-        verifyIndexSchemeChange(true, true);
-
-        String tableName = generateUniqueName();
-        String indexName = generateUniqueName();
-        String createTableDDL = "create IMMUTABLE TABLE " + tableName + "(id char(1) NOT NULL, col1 char(1), col2 char(1) "
-                + "CONSTRAINT NAME_PK PRIMARY KEY (id)) IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS";
-        String createIndexDDL = "create INDEX " + indexName + " ON " + tableName + " (col1) INCLUDE (col2) IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN";
-
-        Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES);
-        try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
-            conn.createStatement().execute(createTableDDL);
-            assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS,
-                    ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS, tableName, conn);
-
-            boolean failed = false;
-            try {
-                conn.createStatement().execute(createIndexDDL);
-            } catch (SQLException e) {
-                assertEquals(e.getErrorCode(), SQLExceptionCode.INVALID_IMMUTABLE_STORAGE_SCHEME_CHANGE.getErrorCode());
-                failed = true;
-            }
-            assertEquals(true, failed);
-        }
-    }
-
-    private void verifyIndexSchemeChange(boolean immutable, boolean multiTenant) throws Exception{
-        Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES);
-        String nonEncodedOneCellPerColumnTable = generateUniqueName();
-        String createTableDDL;
-        String createIndexDDL;
-        String tableName= "[TABLE_NAME]";
-        String indexName= "[INDEX_NAME]";
-        String createTableBaseDDL = "create " + (immutable? " IMMUTABLE ":"") + " TABLE [TABLE_NAME] ("
-                + " id char(1) NOT NULL," + " col1 integer NOT NULL,"
-                + " col2 bigint NOT NULL,"
-                + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)) MULTI_TENANT=" + (multiTenant? "true,":"false,");
-
-        String createIndexBaseDDL = "create index [INDEX_NAME] ON [TABLE_NAME] (col1) INCLUDE (col2) ";
-
-        try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
-            createTableDDL = createTableBaseDDL.replace(tableName, nonEncodedOneCellPerColumnTable);
-            createTableDDL += "IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, COLUMN_ENCODED_BYTES=0";
-            conn.createStatement().execute(createTableDDL);
-            assertColumnEncodingMetadata(QualifierEncodingScheme.NON_ENCODED_QUALIFIERS,
-                    ImmutableStorageScheme.ONE_CELL_PER_COLUMN,
-                    nonEncodedOneCellPerColumnTable, conn);
-
-            String idxName = "IDX_" + generateUniqueName();
-            // Don't specify anything to see if it inherits from parent
-            createIndexDDL = createIndexBaseDDL.replace(indexName, idxName).replace(tableName, nonEncodedOneCellPerColumnTable);
-            conn.createStatement().execute(createIndexDDL);
-            assertColumnEncodingMetadata(QualifierEncodingScheme.NON_ENCODED_QUALIFIERS,
-                    ImmutableStorageScheme.ONE_CELL_PER_COLUMN,
-                    idxName, conn);
-
-            idxName = "IDX_" + generateUniqueName();
-            createIndexDDL = createIndexBaseDDL.replace(indexName, idxName).replace(tableName, nonEncodedOneCellPerColumnTable);
-            createIndexDDL += "IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS";
-            conn.createStatement().execute(createIndexDDL);
-            // Check if it sets the encoding to 2
-            assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS,
-                    ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS,
-                    idxName, conn);
-
-            idxName = "IDX_" + generateUniqueName();
-            createIndexDDL = createIndexBaseDDL.replace(indexName, idxName).replace(tableName, nonEncodedOneCellPerColumnTable);
-            createIndexDDL += "IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS, COLUMN_ENCODED_BYTES=3";
-            conn.createStatement().execute(createIndexDDL);
-            assertColumnEncodingMetadata(QualifierEncodingScheme.THREE_BYTE_QUALIFIERS,
-                    ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS,
-                    idxName, conn);
-
-            createIndexDDL = createIndexBaseDDL.replace(indexName, idxName).replace(tableName, nonEncodedOneCellPerColumnTable);
-            createIndexDDL += "IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS, COLUMN_ENCODED_BYTES=0";
-            // should fail
-            boolean failed = false;
-            try {
-                conn.createStatement().execute(createIndexDDL);
-            } catch (SQLException e) {
-                failed = true;
-                assertEquals(SQLExceptionCode.INVALID_IMMUTABLE_STORAGE_SCHEME_AND_COLUMN_QUALIFIER_BYTES.getErrorCode(),e.getErrorCode());
-            }
-            assertEquals(true, failed);
-        }
-    }
-
     private void verifyUCFValueInSysCat(String tableName, String createTableString,
             Properties props, long expectedUCFInSysCat) throws SQLException {
         String readSysCatQuery = "SELECT TABLE_NAME, UPDATE_CACHE_FREQUENCY FROM SYSTEM.CATALOG "
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 86a5cc1..0a45981 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -2534,46 +2534,28 @@ public class MetaDataClient {
                  * 
                  */
                 if (parent != null) {
-                    Byte encodingSchemeSerializedByte = (Byte) TableProperty.COLUMN_ENCODED_BYTES.getValue(tableProps);
-                    // Table has encoding scheme defined
-                    if (encodingSchemeSerializedByte != null) {
-                        encodingScheme = getEncodingScheme(tableProps, schemaName, tableName, transactionProvider);
-                    } else {
-                        encodingScheme = parent.getEncodingScheme();
-                    }
-
-                    ImmutableStorageScheme immutableStorageSchemeProp = (ImmutableStorageScheme) TableProperty.IMMUTABLE_STORAGE_SCHEME.getValue(tableProps);
-                    if (immutableStorageSchemeProp == null) {
-                        immutableStorageScheme = parent.getImmutableStorageScheme();
+                    encodingScheme = parent.getEncodingScheme();
+                    immutableStorageScheme = parent.getImmutableStorageScheme();
+                } else {
+                	Byte encodingSchemeSerializedByte = (Byte) TableProperty.COLUMN_ENCODED_BYTES.getValue(tableProps);
+                    if (encodingSchemeSerializedByte == null) {
+                        // Ignore default if transactional and column encoding is not supported (as with OMID)
+                        if (transactionProvider == null || !transactionProvider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING) ) {
+                            encodingSchemeSerializedByte = (byte)connection.getQueryServices().getProps().getInt(QueryServices.DEFAULT_COLUMN_ENCODED_BYTES_ATRRIB,
+                                    QueryServicesOptions.DEFAULT_COLUMN_ENCODED_BYTES);
+                            encodingScheme =  QualifierEncodingScheme.fromSerializedValue(encodingSchemeSerializedByte);
+                        }
                     } else {
-                        immutableStorageScheme = getImmutableStorageScheme(immutableStorageSchemeProp, schemaName, tableName, transactionProvider);
-                    }
-
-                    if (immutableStorageScheme == SINGLE_CELL_ARRAY_WITH_OFFSETS) {
-                        if (encodingScheme == NON_ENCODED_QUALIFIERS) {
-                            if (encodingSchemeSerializedByte != null) {
-                                // encoding scheme is set as non-encoded on purpose, so we should fail
-                                throw new SQLExceptionInfo.Builder(SQLExceptionCode.INVALID_IMMUTABLE_STORAGE_SCHEME_AND_COLUMN_QUALIFIER_BYTES)
-                                        .setSchemaName(schemaName).setTableName(tableName).build().buildException();
-                            } else {
-                                // encoding scheme is inherited from parent but it is not compatible with Single Cell.
-                                encodingScheme =
-                                        QualifierEncodingScheme.fromSerializedValue(
-                                                (byte) QueryServicesOptions.DEFAULT_COLUMN_ENCODED_BYTES);
-                            }
+                        encodingScheme =  QualifierEncodingScheme.fromSerializedValue(encodingSchemeSerializedByte);
+                        if (encodingScheme != NON_ENCODED_QUALIFIERS && transactionProvider != null && transactionProvider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING) ) {
+                            throw new SQLExceptionInfo.Builder(
+                                    SQLExceptionCode.UNSUPPORTED_COLUMN_ENCODING_FOR_TXN_PROVIDER)
+                            .setSchemaName(schemaName).setTableName(tableName)
+                            .setMessage(transactionProvider.name())
+                            .build()
+                            .buildException();
                         }
                     }
-
-                    if (parent.getImmutableStorageScheme() == SINGLE_CELL_ARRAY_WITH_OFFSETS && immutableStorageScheme == ONE_CELL_PER_COLUMN) {
-                        throw new SQLExceptionInfo.Builder(
-                                SQLExceptionCode.INVALID_IMMUTABLE_STORAGE_SCHEME_CHANGE)
-                                .setSchemaName(schemaName).setTableName(tableName).build()
-                                .buildException();
-                    }
-                    LOGGER.info(String.format("STORAGE--ENCODING: %s--%s", immutableStorageScheme, encodingScheme));
-                } else {
-                    encodingScheme = getEncodingScheme(tableProps, schemaName, tableName, transactionProvider);
-
                     if (isImmutableRows) {
                         ImmutableStorageScheme immutableStorageSchemeProp =
                                 (ImmutableStorageScheme) TableProperty.IMMUTABLE_STORAGE_SCHEME
@@ -2604,7 +2586,15 @@ public class MetaDataClient {
                                 }
                             }
                         } else {
-                            immutableStorageScheme = getImmutableStorageScheme(immutableStorageSchemeProp, schemaName, tableName, transactionProvider);
+                            immutableStorageScheme = immutableStorageSchemeProp;
+                            if (immutableStorageScheme != ONE_CELL_PER_COLUMN && transactionProvider != null && transactionProvider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING) ) {
+                                throw new SQLExceptionInfo.Builder(
+                                        SQLExceptionCode.UNSUPPORTED_STORAGE_FORMAT_FOR_TXN_PROVIDER)
+                                .setSchemaName(schemaName).setTableName(tableName)
+                                .setMessage(transactionProvider.name())
+                                .build()
+                                .buildException();
+                            }
                         }
                         if (immutableStorageScheme != ONE_CELL_PER_COLUMN
                                 && encodingScheme == NON_ENCODED_QUALIFIERS) {
@@ -3143,44 +3133,6 @@ public class MetaDataClient {
         }
     }
 
-    private QualifierEncodingScheme getEncodingScheme(Map<String, Object> tableProps, String schemaName, String tableName, TransactionFactory.Provider transactionProvider)
-            throws SQLException {
-        QualifierEncodingScheme encodingScheme = null;
-        Byte encodingSchemeSerializedByte = (Byte) TableProperty.COLUMN_ENCODED_BYTES.getValue(tableProps);
-        if (encodingSchemeSerializedByte == null) {
-            // Ignore default if transactional and column encoding is not supported (as with OMID)
-            if (transactionProvider == null || !transactionProvider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING) ) {
-                encodingSchemeSerializedByte = (byte)connection.getQueryServices().getProps().getInt(QueryServices.DEFAULT_COLUMN_ENCODED_BYTES_ATRRIB,
-                        QueryServicesOptions.DEFAULT_COLUMN_ENCODED_BYTES);
-                encodingScheme =  QualifierEncodingScheme.fromSerializedValue(encodingSchemeSerializedByte);
-            } else {
-                encodingScheme = NON_ENCODED_QUALIFIERS;
-            }
-        } else {
-            encodingScheme = QualifierEncodingScheme.fromSerializedValue(encodingSchemeSerializedByte);
-            if (encodingScheme != NON_ENCODED_QUALIFIERS && transactionProvider != null && transactionProvider.getTransactionProvider()
-                    .isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING)) {
-                throw new SQLExceptionInfo.Builder(SQLExceptionCode.UNSUPPORTED_COLUMN_ENCODING_FOR_TXN_PROVIDER)
-                        .setSchemaName(schemaName).setTableName(tableName).setMessage(transactionProvider.name()).build().buildException();
-            }
-        }
-
-        return encodingScheme;
-    }
-
-    private ImmutableStorageScheme getImmutableStorageScheme(ImmutableStorageScheme immutableStorageSchemeProp, String schemaName, String tableName, TransactionFactory.Provider transactionProvider)
-            throws SQLException {
-        if (immutableStorageSchemeProp != ONE_CELL_PER_COLUMN && transactionProvider != null && transactionProvider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.COLUMN_ENCODING) ) {
-            throw new SQLExceptionInfo.Builder(
-                    SQLExceptionCode.UNSUPPORTED_STORAGE_FORMAT_FOR_TXN_PROVIDER)
-                    .setSchemaName(schemaName).setTableName(tableName)
-                    .setMessage(transactionProvider.name())
-                    .build()
-                    .buildException();
-        }
-        return immutableStorageSchemeProp;
-    }
-
     /* This method handles mutation codes sent by phoenix server, except for TABLE_NOT_FOUND which
     * is considered to be a success code. If TABLE_ALREADY_EXISTS in hbase, we don't need to add
     * it in ConnectionQueryServices and we return result as true. However if code is