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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2a395f7  HIVE-22072: Altering table to make a column change does not 
update constraints references (Jesus Camacho Rodriguez, reviewed by Vineet Garg)
2a395f7 is described below

commit 2a395f79ba85cf92ece7ae78a4e463a754e5e9f0
Author: Jesus Camacho Rodriguez <[email protected]>
AuthorDate: Thu Aug 1 09:07:45 2019 -0700

    HIVE-22072: Altering table to make a column change does not update 
constraints references (Jesus Camacho Rodriguez, reviewed by Vineet Garg)
    
    Close apache/hive#743
---
 .../test/resources/testconfiguration.properties    |   1 +
 .../queries/clientpositive/constraints_alter.q     |  88 +++++++
 .../clientpositive/llap/constraints_alter.q.out    | 269 +++++++++++++++++++++
 .../apache/hadoop/hive/metastore/ObjectStore.java  |  62 ++++-
 4 files changed, 412 insertions(+), 8 deletions(-)

diff --git a/itests/src/test/resources/testconfiguration.properties 
b/itests/src/test/resources/testconfiguration.properties
index dcd7056..f390dc5 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -497,6 +497,7 @@ minillaplocal.query.files=\
   compare_double_bigint_2.q,\
   constprog_dpp.q,\
   constant_prop_when.q,\
+  constraints_alter.q,\
   constraints_optimization.q,\
   current_date_timestamp.q,\
   correlationoptimizer1.q,\
diff --git a/ql/src/test/queries/clientpositive/constraints_alter.q 
b/ql/src/test/queries/clientpositive/constraints_alter.q
new file mode 100644
index 0000000..ab2c4d3
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/constraints_alter.q
@@ -0,0 +1,88 @@
+CREATE EXTERNAL TABLE IF NOT EXISTS `COLUMNS_V2` (
+  `CD_ID` bigint,
+  `COMMENT` string,
+  `COLUMN_NAME` string,
+  `TYPE_NAME` string,
+  `INTEGER_IDX` int,
+  CONSTRAINT `SYS_PK_COLUMN_V2` PRIMARY KEY (`CD_ID`,`COLUMN_NAME`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CD_ID\",
+  \"COMMENT\",
+  \"COLUMN_NAME\",
+  \"TYPE_NAME\",
+  \"INTEGER_IDX\"
+FROM
+  \"COLUMNS_V2\""
+);
+
+CREATE EXTERNAL TABLE IF NOT EXISTS `KEY_CONSTRAINTS`
+(
+  `CHILD_CD_ID` bigint,
+  `CHILD_INTEGER_IDX` int,
+  `CHILD_TBL_ID` bigint,
+  `PARENT_CD_ID` bigint,
+  `PARENT_INTEGER_IDX` int,
+  `PARENT_TBL_ID` bigint,
+  `POSITION` bigint,
+  `CONSTRAINT_NAME` string,
+  `CONSTRAINT_TYPE` string,
+  `UPDATE_RULE` string,
+  `DELETE_RULE` string,
+  `ENABLE_VALIDATE_RELY` int,
+  `DEFAULT_VALUE` string,
+  CONSTRAINT `SYS_PK_KEY_CONSTRAINTS` PRIMARY KEY (`CONSTRAINT_NAME`, 
`POSITION`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CHILD_CD_ID\",
+  \"CHILD_INTEGER_IDX\",
+  \"CHILD_TBL_ID\",
+  \"PARENT_CD_ID\",
+  \"PARENT_INTEGER_IDX\",
+  \"PARENT_TBL_ID\",
+  \"POSITION\",
+  \"CONSTRAINT_NAME\",
+  \"CONSTRAINT_TYPE\",
+  \"UPDATE_RULE\",
+  \"DELETE_RULE\",
+  \"ENABLE_VALIDATE_RELY\",
+  \"DEFAULT_VALUE\"
+FROM
+  \"KEY_CONSTRAINTS\""
+);
+
+
+create table t1_n2939 (a_n2939 integer, b_n2939 string);
+
+insert into table t1_n2939 values (1, '1'), (2, '2');
+
+select COLUMN_NAME from columns_v2 where column_name = 'a_n2939' or 
column_name = 'b_n2939' or column_name = 'c_n2939';
+select CONSTRAINT_NAME from key_constraints where constraint_name = 
't1_n2939_pk' or constraint_name = 't1_n2939_nn' or constraint_name = 
't1_n2939_nn_2';
+
+alter table t1_n2939 add constraint t1_n2939_pk primary key (a_n2939) disable 
novalidate rely;
+
+select COLUMN_NAME from columns_v2 where column_name = 'a_n2939' or 
column_name = 'b_n2939' or column_name = 'c_n2939';
+select CONSTRAINT_NAME from key_constraints where constraint_name = 
't1_n2939_pk' or constraint_name = 't1_n2939_nn' or constraint_name = 
't1_n2939_nn_2';
+
+alter table t1_n2939 change column b_n2939 b_n2939 string constraint 
t1_n2939_nn not null disable novalidate rely;
+
+select COLUMN_NAME from columns_v2 where column_name = 'a_n2939' or 
column_name = 'b_n2939' or column_name = 'c_n2939';
+select CONSTRAINT_NAME from key_constraints where constraint_name = 
't1_n2939_pk' or constraint_name = 't1_n2939_nn' or constraint_name = 
't1_n2939_nn_2';
+
+alter table t1_n2939 change column b_n2939 c_n2939 string constraint 
t1_n2939_nn_2 not null disable novalidate rely;
+
+select COLUMN_NAME from columns_v2 where column_name = 'a_n2939' or 
column_name = 'b_n2939' or column_name = 'c_n2939';
+select CONSTRAINT_NAME from key_constraints where constraint_name = 
't1_n2939_pk' or constraint_name = 't1_n2939_nn' or constraint_name = 
't1_n2939_nn_2';
+
+drop table t1_n2939;
+
+select COLUMN_NAME from columns_v2 where column_name = 'a_n2939' or 
column_name = 'b_n2939' or column_name = 'c_n2939';
+select CONSTRAINT_NAME from key_constraints where constraint_name = 
't1_n2939_pk' or constraint_name = 't1_n2939_nn' or constraint_name = 
't1_n2939_nn_2';
diff --git a/ql/src/test/results/clientpositive/llap/constraints_alter.q.out 
b/ql/src/test/results/clientpositive/llap/constraints_alter.q.out
new file mode 100644
index 0000000..a66d148
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/constraints_alter.q.out
@@ -0,0 +1,269 @@
+PREHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS `COLUMNS_V2` (
+  `CD_ID` bigint,
+  `COMMENT` string,
+  `COLUMN_NAME` string,
+  `TYPE_NAME` string,
+  `INTEGER_IDX` int,
+  CONSTRAINT `SYS_PK_COLUMN_V2` PRIMARY KEY (`CD_ID`,`COLUMN_NAME`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CD_ID\",
+  \"COMMENT\",
+  \"COLUMN_NAME\",
+  \"TYPE_NAME\",
+  \"INTEGER_IDX\"
+FROM
+  \"COLUMNS_V2\""
+)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@COLUMNS_V2
+POSTHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS `COLUMNS_V2` (
+  `CD_ID` bigint,
+  `COMMENT` string,
+  `COLUMN_NAME` string,
+  `TYPE_NAME` string,
+  `INTEGER_IDX` int,
+  CONSTRAINT `SYS_PK_COLUMN_V2` PRIMARY KEY (`CD_ID`,`COLUMN_NAME`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CD_ID\",
+  \"COMMENT\",
+  \"COLUMN_NAME\",
+  \"TYPE_NAME\",
+  \"INTEGER_IDX\"
+FROM
+  \"COLUMNS_V2\""
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@COLUMNS_V2
+PREHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS `KEY_CONSTRAINTS`
+(
+  `CHILD_CD_ID` bigint,
+  `CHILD_INTEGER_IDX` int,
+  `CHILD_TBL_ID` bigint,
+  `PARENT_CD_ID` bigint,
+  `PARENT_INTEGER_IDX` int,
+  `PARENT_TBL_ID` bigint,
+  `POSITION` bigint,
+  `CONSTRAINT_NAME` string,
+  `CONSTRAINT_TYPE` string,
+  `UPDATE_RULE` string,
+  `DELETE_RULE` string,
+  `ENABLE_VALIDATE_RELY` int,
+  `DEFAULT_VALUE` string,
+  CONSTRAINT `SYS_PK_KEY_CONSTRAINTS` PRIMARY KEY (`CONSTRAINT_NAME`, 
`POSITION`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CHILD_CD_ID\",
+  \"CHILD_INTEGER_IDX\",
+  \"CHILD_TBL_ID\",
+  \"PARENT_CD_ID\",
+  \"PARENT_INTEGER_IDX\",
+  \"PARENT_TBL_ID\",
+  \"POSITION\",
+  \"CONSTRAINT_NAME\",
+  \"CONSTRAINT_TYPE\",
+  \"UPDATE_RULE\",
+  \"DELETE_RULE\",
+  \"ENABLE_VALIDATE_RELY\",
+  \"DEFAULT_VALUE\"
+FROM
+  \"KEY_CONSTRAINTS\""
+)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@KEY_CONSTRAINTS
+POSTHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS `KEY_CONSTRAINTS`
+(
+  `CHILD_CD_ID` bigint,
+  `CHILD_INTEGER_IDX` int,
+  `CHILD_TBL_ID` bigint,
+  `PARENT_CD_ID` bigint,
+  `PARENT_INTEGER_IDX` int,
+  `PARENT_TBL_ID` bigint,
+  `POSITION` bigint,
+  `CONSTRAINT_NAME` string,
+  `CONSTRAINT_TYPE` string,
+  `UPDATE_RULE` string,
+  `DELETE_RULE` string,
+  `ENABLE_VALIDATE_RELY` int,
+  `DEFAULT_VALUE` string,
+  CONSTRAINT `SYS_PK_KEY_CONSTRAINTS` PRIMARY KEY (`CONSTRAINT_NAME`, 
`POSITION`) DISABLE
+)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+"hive.sql.database.type" = "METASTORE",
+"hive.sql.query" =
+"SELECT
+  \"CHILD_CD_ID\",
+  \"CHILD_INTEGER_IDX\",
+  \"CHILD_TBL_ID\",
+  \"PARENT_CD_ID\",
+  \"PARENT_INTEGER_IDX\",
+  \"PARENT_TBL_ID\",
+  \"POSITION\",
+  \"CONSTRAINT_NAME\",
+  \"CONSTRAINT_TYPE\",
+  \"UPDATE_RULE\",
+  \"DELETE_RULE\",
+  \"ENABLE_VALIDATE_RELY\",
+  \"DEFAULT_VALUE\"
+FROM
+  \"KEY_CONSTRAINTS\""
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@KEY_CONSTRAINTS
+PREHOOK: query: create table t1_n2939 (a_n2939 integer, b_n2939 string)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@t1_n2939
+POSTHOOK: query: create table t1_n2939 (a_n2939 integer, b_n2939 string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@t1_n2939
+PREHOOK: query: insert into table t1_n2939 values (1, '1'), (2, '2')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@t1_n2939
+POSTHOOK: query: insert into table t1_n2939 values (1, '1'), (2, '2')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@t1_n2939
+POSTHOOK: Lineage: t1_n2939.a_n2939 SCRIPT []
+POSTHOOK: Lineage: t1_n2939.b_n2939 SCRIPT []
+PREHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+POSTHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+a_n2939
+b_n2939
+PREHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+POSTHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+PREHOOK: query: alter table t1_n2939 add constraint t1_n2939_pk primary key 
(a_n2939) disable novalidate rely
+PREHOOK: type: ALTERTABLE_ADDCONSTRAINT
+POSTHOOK: query: alter table t1_n2939 add constraint t1_n2939_pk primary key 
(a_n2939) disable novalidate rely
+POSTHOOK: type: ALTERTABLE_ADDCONSTRAINT
+PREHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+POSTHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+a_n2939
+b_n2939
+PREHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+POSTHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+t1_n2939_pk
+PREHOOK: query: alter table t1_n2939 change column b_n2939 b_n2939 string 
constraint t1_n2939_nn not null disable novalidate rely
+PREHOOK: type: ALTERTABLE_RENAMECOL
+PREHOOK: Input: default@t1_n2939
+PREHOOK: Output: default@t1_n2939
+POSTHOOK: query: alter table t1_n2939 change column b_n2939 b_n2939 string 
constraint t1_n2939_nn not null disable novalidate rely
+POSTHOOK: type: ALTERTABLE_RENAMECOL
+POSTHOOK: Input: default@t1_n2939
+POSTHOOK: Output: default@t1_n2939
+PREHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+POSTHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+a_n2939
+b_n2939
+PREHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+POSTHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+t1_n2939_pk
+t1_n2939_nn
+PREHOOK: query: alter table t1_n2939 change column b_n2939 c_n2939 string 
constraint t1_n2939_nn_2 not null disable novalidate rely
+PREHOOK: type: ALTERTABLE_RENAMECOL
+PREHOOK: Input: default@t1_n2939
+PREHOOK: Output: default@t1_n2939
+POSTHOOK: query: alter table t1_n2939 change column b_n2939 c_n2939 string 
constraint t1_n2939_nn_2 not null disable novalidate rely
+POSTHOOK: type: ALTERTABLE_RENAMECOL
+POSTHOOK: Input: default@t1_n2939
+POSTHOOK: Output: default@t1_n2939
+PREHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+POSTHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+a_n2939
+c_n2939
+PREHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+POSTHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+t1_n2939_pk
+t1_n2939_nn_2
+PREHOOK: query: drop table t1_n2939
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@t1_n2939
+PREHOOK: Output: default@t1_n2939
+POSTHOOK: query: drop table t1_n2939
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@t1_n2939
+POSTHOOK: Output: default@t1_n2939
+PREHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+POSTHOOK: query: select COLUMN_NAME from columns_v2 where column_name = 
'a_n2939' or column_name = 'b_n2939' or column_name = 'c_n2939'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@columns_v2
+#### A masked pattern was here ####
+PREHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
+POSTHOOK: query: select CONSTRAINT_NAME from key_constraints where 
constraint_name = 't1_n2939_pk' or constraint_name = 't1_n2939_nn' or 
constraint_name = 't1_n2939_nn_2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@key_constraints
+#### A masked pattern was here ####
diff --git 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
index def32c7..12bdb64 100644
--- 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
+++ 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
@@ -4474,14 +4474,52 @@ public class ObjectStore implements RawStore, 
Configurable {
     // Convert the MFieldSchema's to their thrift object counterparts, because 
we maintain
     // datastore identity (i.e., identity of the model objects are managed by 
JDO,
     // not the application).
-    if (!(oldSd != null && oldSd.getCD() != null &&
-         oldSd.getCD().getCols() != null &&
-         newSd != null && newSd.getCD() != null &&
-         newSd.getCD().getCols() != null &&
-         convertToFieldSchemas(newSd.getCD().getCols()).
-         equals(convertToFieldSchemas(oldSd.getCD().getCols()))
-       )) {
-        oldSd.setCD(newSd.getCD());
+    List<FieldSchema> oldCols = oldSd != null && oldSd.getCD() != null && 
oldSd.getCD().getCols() != null ?
+        convertToFieldSchemas(oldSd.getCD().getCols()) : null;
+    List<FieldSchema> newCols = newSd != null && newSd.getCD() != null && 
newSd.getCD().getCols() != null ?
+        convertToFieldSchemas(newSd.getCD().getCols()) : null;
+    if (oldCols == null || !oldCols.equals(newCols)) {
+      // First replace any constraints that may be associated with this CD
+      // Create mapping from old col indexes to new col indexes
+      if (oldCols != null && newCols != null) {
+        Map<Integer, Integer> mapping = new HashMap<>();
+        for (int i = 0; i < oldCols.size(); i++) {
+          FieldSchema oldCol = oldCols.get(i);
+          for (int j = 0; j < newCols.size(); j++) {
+            FieldSchema newCol = newCols.get(j);
+            if (oldCol.equals(newCol)) {
+              mapping.put(i, j);
+              break;
+            }
+          }
+        }
+        // If we find it, we will change the reference for the CD.
+        // If we do not find it, i.e., the column will be deleted, we do not 
change it
+        // and we let the logic in removeUnusedColumnDescriptor take care of it
+        Query query = pm.newQuery(MConstraint.class, "parentColumn == inCD || 
childColumn == inCD");
+        query.declareParameters("MColumnDescriptor inCD");
+        List<MConstraint> mConstraintsList = (List<MConstraint>) 
query.execute(oldSd.getCD());
+        pm.retrieveAll(mConstraintsList);
+        for (MConstraint mConstraint : mConstraintsList) {
+          if (oldSd.getCD().equals(mConstraint.getParentColumn())) {
+            Integer newIdx = mapping.get(mConstraint.getParentIntegerIndex());
+            if (newIdx != null) {
+              mConstraint.setParentColumn(newSd.getCD());
+              mConstraint.setParentIntegerIndex(newIdx);
+            }
+          }
+          if (oldSd.getCD().equals(mConstraint.getChildColumn())) {
+            Integer newIdx = mapping.get(mConstraint.getChildIntegerIndex());
+            if (newIdx != null) {
+              mConstraint.setChildColumn(newSd.getCD());
+              mConstraint.setChildIntegerIndex(newIdx);
+            }
+          }
+        }
+        pm.makePersistentAll(mConstraintsList);
+      }
+      // Finally replace CD
+      oldSd.setCD(newSd.getCD());
     }
 
     oldSd.setBucketCols(newSd.getBucketCols());
@@ -4525,6 +4563,14 @@ public class ObjectStore implements RawStore, 
Configurable {
 
       //if no other SD references this CD, we can throw it out.
       if (count == 0) {
+        // First remove any constraints that may be associated with this CD
+        query = pm.newQuery(MConstraint.class, "parentColumn == inCD || 
childColumn == inCD");
+        query.declareParameters("MColumnDescriptor inCD");
+        List<MConstraint> mConstraintsList = (List<MConstraint>) 
query.execute(oldCD);
+        if (CollectionUtils.isNotEmpty(mConstraintsList)) {
+          pm.deletePersistentAll(mConstraintsList);
+        }
+        // Finally remove CD
         pm.retrieve(oldCD);
         pm.deletePersistent(oldCD);
       }

Reply via email to