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

2020-11-17 Thread gokcen
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 9f5a0bf  PHOENIX-6220 CREATE INDEX shouldn't ignore 
IMMUTABLE_STORAGE_SCHEME and COLUMN_ENDCODED_BYTES
9f5a0bf is described below

commit 9f5a0bf75ea571ff629e9aaa3001d61cbfa37663
Author: Gokcen Iskender 
AuthorDate: Wed Nov 11 16:37:39 2020 -0800

PHOENIX-6220 CREATE INDEX shouldn't ignore IMMUTABLE_STORAGE_SCHEME and 
COLUMN_ENDCODED_BYTES

Signed-off-by: Gokcen Iskender 
---
 .../org/apache/phoenix/end2end/CreateTableIT.java  |  90 ++
 .../org/apache/phoenix/schema/MetaDataClient.java  | 104 +++--
 2 files changed, 166 insertions(+), 28 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 4f6ccab..0099668 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,6 +622,96 @@ 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 createTableBaseDDL = "create " + (immutable? " IMMUTABLE ":"") 
+ " TABLE %s ("
++ " 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 %s ON %s (col1) INCLUDE 
(col2) ";
+
+try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+createTableDDL = String.format(createTableBaseDDL, 
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 = String.format(createIndexBaseDDL, idxName, 
nonEncodedOneCellPerColumnTable);
+conn.createStatement().execute(createIndexDDL);
+
assertColumnEncodingMetadata(QualifierEncodingScheme.NON_ENCODED_QUALIFIERS,
+ImmutableStorageScheme.ONE_CELL_PER_COLUMN,
+idxName, conn);
+
+idxName = "IDX_" + generateUniqueName();
+createIndexDDL = String.format(createIndexBaseDDL, idxName, 
nonEncodedOneCellPerColumnTable);
+createIndexDDL += 
"IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS";
+

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

2020-11-16 Thread gokcen
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 a2cd0a1  PHOENIX-6220 CREATE INDEX shouldn't ignore 
IMMUTABLE_STORAGE_SCHEME and COLUMN_ENDCODED_BYTES
a2cd0a1 is described below

commit a2cd0a13ae5b11a13306e7f6d023559bc3f3e49c
Author: Gokcen Iskender 
AuthorDate: Wed Nov 11 16:37:39 2020 -0800

PHOENIX-6220 CREATE INDEX shouldn't ignore IMMUTABLE_STORAGE_SCHEME and 
COLUMN_ENDCODED_BYTES

Signed-off-by: Gokcen Iskender 
---
 .../org/apache/phoenix/end2end/CreateTableIT.java  |  91 ++
 .../org/apache/phoenix/schema/MetaDataClient.java  | 104 +++--
 2 files changed, 167 insertions(+), 28 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 4f6ccab..c92be7c 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,6 +622,97 @@ 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,