You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sk...@apache.org on 2021/02/09 21:52:37 UTC

[phoenix] branch 4.x updated: PHOENIX-6344: CASCADE on ALTER should NOOP when there are no secondary indexes (#1135)

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

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


The following commit(s) were added to refs/heads/4.x by this push:
     new 883170e  PHOENIX-6344: CASCADE on ALTER should NOOP when there are no secondary indexes (#1135)
883170e is described below

commit 883170ef5d0bddde5a78dd13717e3f57996d1d8b
Author: Swaroopa Kadam <sw...@gmail.com>
AuthorDate: Tue Feb 9 13:52:29 2021 -0800

    PHOENIX-6344: CASCADE on ALTER should NOOP when there are no secondary indexes (#1135)
---
 .../phoenix/end2end/AlterAddCascadeIndexIT.java    | 83 +++++++++++++++-------
 .../org/apache/phoenix/schema/MetaDataClient.java  | 12 +++-
 2 files changed, 68 insertions(+), 27 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterAddCascadeIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterAddCascadeIndexIT.java
index def4814..dc35013 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterAddCascadeIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterAddCascadeIndexIT.java
@@ -64,15 +64,15 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
     public ExpectedException exception = ExpectedException.none();
     private static Connection conn;
     private Properties prop;
-    private boolean isViewIndex, mutable;
+    private boolean isViewScenario, mutable;
     private String phoenixObjectName;
     private String indexNames;
     private final String tableDDLOptions;
     String fullIndexNameOne, fullIndexNameTwo, fullTableName;
 
 
-    public AlterAddCascadeIndexIT(boolean isViewIndex, boolean mutable) {
-        this.isViewIndex = isViewIndex;
+    public AlterAddCascadeIndexIT(boolean isViewScenario, boolean mutable) {
+        this.isViewScenario = isViewScenario;
         StringBuilder optionBuilder = new StringBuilder("COLUMN_ENCODED_BYTES=0");
         if (!mutable) {
 
@@ -110,7 +110,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
                 "      population BIGINT,\n" +
                 "      CONSTRAINT my_pk PRIMARY KEY (state, city)) " + tableDDLOptions);
 
-        if(isViewIndex) {
+        if(isViewScenario) {
             conn.createStatement().execute("CREATE VIEW IF NOT EXISTS " + fullViewName +
                     " (city_area INTEGER, avg_fam_size INTEGER) AS " +
                     "SELECT * FROM "+fullTableName+" WHERE state = 'CA'");
@@ -136,10 +136,10 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
     // Test with ALTER TABLE/VIEW CASCADE INDEX ALL with upserting into new column
     @Test
     public void testAlterDBOAddCascadeIndexAllUpsert() throws Exception {
-        String query = "ALTER " +(isViewIndex? "VIEW " : "TABLE ") + phoenixObjectName + " ADD new_column_3 VARCHAR(64) CASCADE INDEX ALL";
+        String query = "ALTER " +(isViewScenario ? "VIEW " : "TABLE ") + phoenixObjectName + " ADD new_column_3 VARCHAR(64) CASCADE INDEX ALL";
         conn.createStatement().execute(query);
         PreparedStatement ps;
-        if(isViewIndex) {
+        if(isViewScenario) {
             ps = conn.prepareStatement("UPSERT INTO " + phoenixObjectName +
                     "(state,city,population,city_area,avg_fam_size,new_column_3) " +
                     "VALUES('CA','Santa Barbara',912332,1300,4,'test_column')");
@@ -151,7 +151,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
         ps.executeUpdate();
         ColumnInfo [] columnArray =  {new ColumnInfo("new_column_3", PVarchar.INSTANCE.getSqlType(), 64)};
         ColumnInfo [] columnIndexArray =  {new ColumnInfo("0:new_column_3", PVarchar.INSTANCE.getSqlType(), 64)};
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 6, columnArray, false);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 5, columnIndexArray, false);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 5, columnIndexArray, false);
@@ -172,16 +172,51 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
 
     }
 
+    // Test with ALTER TABLE/VIEW CASCADE INDEX ALL with no indexes
+    @Test
+    public void testAlterDBOAddCascadeIndexAll_noIndexes() throws Exception {
+        String schemaName = "S_"+generateUniqueName();
+        String tableName = "T_"+generateUniqueName();
+        String viewName = "V_"+generateUniqueName();
+
+        String fullViewName = SchemaUtil.getQualifiedTableName(schemaName, viewName);
+        String fullTableName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
+
+        conn.createStatement().execute("CREATE TABLE IF NOT EXISTS " + fullTableName + " (\n" +
+                "      state CHAR(2) NOT NULL,\n" +
+                "      city VARCHAR NOT NULL,\n" +
+                "      population BIGINT,\n" +
+                "      CONSTRAINT my_pk PRIMARY KEY (state, city)) " + tableDDLOptions);
+
+        if(isViewScenario) {
+            conn.createStatement().execute("CREATE VIEW IF NOT EXISTS " + fullViewName
+                    + " (city_area INTEGER, avg_fam_size INTEGER) AS " + "SELECT * FROM "
+                    + fullTableName + " WHERE state = 'CA'");
+        }
+
+        String query = "ALTER " +(isViewScenario ? "VIEW " : "TABLE ") + (isViewScenario ? fullViewName : fullTableName)
+                + " ADD new_column_3 VARCHAR(64) CASCADE INDEX ALL";
+        conn.createStatement().execute(query);
+
+        ColumnInfo [] columnArray =  {new ColumnInfo("new_column_3", PVarchar.INSTANCE.getSqlType(), 64)};
+        if(isViewScenario) {
+            assertDBODefinition(conn, fullViewName, PTableType.VIEW, 6, columnArray, false);
+        } else {
+            assertDBODefinition(conn, fullTableName, PTableType.TABLE, 4, columnArray, false);
+        }
+
+    }
+
     // Test with CASCADE INDEX <index_name>
     @Test
     public void testAlterDBOAddCascadeIndex() throws Exception {
         ColumnInfo [] columnArray =  {new ColumnInfo("new_column_1", PFloat.INSTANCE.getSqlType())};
         ColumnInfo [] columnIndexArray =  {new ColumnInfo("0:new_column_1", PDecimal.INSTANCE.getSqlType())};
 
-        String query = "ALTER " + (isViewIndex? "VIEW " : "TABLE ")
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 FLOAT CASCADE INDEX " + indexNames.split(",")[0];
         conn.createStatement().execute(query);
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 6, columnArray, false);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 5, columnIndexArray, false);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 4, columnIndexArray, true);
@@ -199,10 +234,10 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
                 new ColumnInfo("new_column_2", PDouble.INSTANCE.getSqlType())};
         ColumnInfo [] columnIndexArray =  {new ColumnInfo("0:new_column_1", PDecimal.INSTANCE.getSqlType()),
                 new ColumnInfo("0:new_column_2", PDecimal.INSTANCE.getSqlType())};
-        String query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ") + phoenixObjectName
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ") + phoenixObjectName
                 + " ADD new_column_1 FLOAT, new_column_2 DOUBLE CASCADE INDEX " + indexNames.split(",")[0];
         conn.createStatement().execute(query);
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 7, columnArray, false);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 6, columnIndexArray, false);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 4, columnIndexArray, true);
@@ -219,10 +254,10 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
     public void testAlterDBOAddCascadeIndexes() throws Exception {
         ColumnInfo [] columnArray = {new ColumnInfo("new_column_1", PDouble.INSTANCE.getSqlType())};
         ColumnInfo [] columnIndexArray = {new ColumnInfo("0:new_column_1", PDecimal.INSTANCE.getSqlType())};
-        String query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 DOUBLE CASCADE INDEX " + indexNames;
         conn.createStatement().execute(query);
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 6, columnArray, false);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 5, columnIndexArray, false);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 5, columnIndexArray, false);
@@ -241,10 +276,10 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
         ColumnInfo [] columIndexArray =  {new ColumnInfo("0:new_column_1", PDecimal.INSTANCE.getSqlType()),
                 new ColumnInfo("0:new_column_2", PDecimal.INSTANCE.getSqlType())};
 
-        String query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 FLOAT, new_column_2 DOUBLE CASCADE INDEX " + indexNames;
         conn.createStatement().execute(query);
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 7, columnArray, false);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 6, columIndexArray, false);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 6, columIndexArray, false);
@@ -260,14 +295,14 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
     @Test
     public void testAlterDBOException() throws SQLException {
 
-        String query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ") + phoenixObjectName + " ADD new_column VARCHAR ALL";
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ") + phoenixObjectName + " ADD new_column VARCHAR ALL";
         try {
             conn.createStatement().execute(query);
         } catch (Exception e) {
             assertTrue(e.getMessage().contains(SYNTAX_ERROR));
         }
 
-        query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ") + phoenixObjectName
+        query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ") + phoenixObjectName
                 + " ADD new_column VARCHAR CASCADE " + indexNames.split(",")[0];
         try {
             conn.createStatement().execute(query);
@@ -275,7 +310,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
             assertTrue(e.getMessage().contains(SYNTAX_ERROR));
         }
 
-        query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ") + phoenixObjectName
+        query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ") + phoenixObjectName
                 + " ADD new_column VARCHAR INDEX " + indexNames.split(",")[0];
         try {
             conn.createStatement().execute(query);
@@ -283,7 +318,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
             assertTrue(e.getMessage().contains(SYNTAX_ERROR));
         }
 
-        query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 DOUBLE CASCADE INDEX INCORRECT_NAME";
         try {
             conn.createStatement().execute(query);
@@ -294,13 +329,13 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
         String localIndex = generateUniqueName();
         String createLocalIndex = "CREATE LOCAL INDEX " + localIndex + " ON "
                 + phoenixObjectName + "(avg_fam_size) INCLUDE (population)";
-        if(!isViewIndex) {
+        if(!isViewScenario) {
             createLocalIndex = "CREATE LOCAL INDEX " + localIndex + " ON "
                     + phoenixObjectName + "(state, population)";
 
         }
         conn.createStatement().execute(createLocalIndex);
-        query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 DOUBLE CASCADE INDEX "+localIndex;
         try {
             conn.createStatement().execute(query);
@@ -309,7 +344,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
                     .NOT_SUPPORTED_CASCADE_FEATURE_LOCAL_INDEX.getMessage()));
         }
 
-        query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_2 DOUBLE CASCADE INDEX "+localIndex + "," + indexNames;
         try {
             conn.createStatement().execute(query);
@@ -323,7 +358,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
     // Exception for incorrect index name
     @Test
     public void testAlterDBOIncorrectIndexNameCombination() throws Exception {
-        String query = "ALTER " + (isViewIndex ? "VIEW " : "TABLE ")
+        String query = "ALTER " + (isViewScenario ? "VIEW " : "TABLE ")
                 + phoenixObjectName + " ADD new_column_1 DOUBLE CASCADE INDEX INCORRECT_NAME, "+ indexNames;
         try {
             conn.createStatement().execute(query);
@@ -332,7 +367,7 @@ public class AlterAddCascadeIndexIT extends ParallelStatsDisabledIT {
         }
         ColumnInfo [] columnArray =  {new ColumnInfo("new_column_1", PFloat.INSTANCE.getSqlType())};
         ColumnInfo [] columnIndexArray =  {new ColumnInfo("0:new_column_1", PDecimal.INSTANCE.getSqlType())};
-        if(isViewIndex) {
+        if(isViewScenario) {
             assertDBODefinition(conn, phoenixObjectName, PTableType.VIEW, 5, columnArray, true);
             assertDBODefinition(conn, fullIndexNameOne, PTableType.INDEX, 4, columnIndexArray, true);
             assertDBODefinition(conn, fullIndexNameTwo, PTableType.INDEX, 4, columnIndexArray, true);
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 919e072..6b54b53 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
@@ -3765,8 +3765,13 @@ public class MetaDataClient {
         // if cascade keyword is passed and indexes are provided either implicitly or explicitly
         if (cascade && (indexes == null || !indexes.isEmpty())) {
             indexesPTable = getIndexesPTableForCascade(indexes, table);
-            for (PTable index : indexesPTable) {
-                indexToColumnSizeMap.put(index, index.getColumns().size());
+            if(indexesPTable.size() == 0) {
+                // go back to regular behavior of altering the table/view
+                cascade = false;
+            } else {
+                for (PTable index : indexesPTable) {
+                    indexToColumnSizeMap.put(index, index.getColumns().size());
+                }
             }
         }
         boolean wasAutoCommit = connection.getAutoCommit();
@@ -4232,7 +4237,8 @@ public class MetaDataClient {
                 // this if clause ensures we only get the indexes that
                 // are only created on the view itself.
                 if (index.getIndexType().equals(IndexType.LOCAL)
-                        || (isView && index.getTableName().toString().contains("#"))) {
+                        || (isView && index.getTableName().toString().contains(
+                        QueryConstants.CHILD_VIEW_INDEX_NAME_SEPARATOR))) {
                     indexesPTable.remove(index);
                 }
             }