You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by mg...@apache.org on 2020/02/17 13:28:56 UTC

[hive] branch master updated: HIVE-22728 Limit the scope of uniqueness of constraint name to database (Miklos Gergely, reviewed by Zoltan Haindrich)

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

mgergely 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 40921bd  HIVE-22728 Limit the scope of uniqueness of constraint name to database (Miklos Gergely, reviewed by Zoltan Haindrich)
40921bd is described below

commit 40921bdd6b49dc04842614701a0d95acff356c79
Author: miklosgergely <mg...@cloudera.com>
AuthorDate: Mon Feb 10 14:27:18 2020 +0100

    HIVE-22728 Limit the scope of uniqueness of constraint name to database (Miklos Gergely, reviewed by Zoltan Haindrich)
---
 .../upgrade/hive/hive-schema-4.0.0.hive.sql        |   2 +-
 .../clientnegative/constraint_duplicate_name.q     |   2 -
 .../create_with_constraints_duplicate_name.q       |  13 +-
 .../clientnegative/constraint_duplicate_name.q.out |  13 --
 .../create_with_constraints_duplicate_name.q.out   |  58 +++++--
 .../hadoop/hive/metastore/HiveMetaStore.java       |   2 +-
 .../apache/hadoop/hive/metastore/ObjectStore.java  | 164 ++++++++++---------
 .../hadoop/hive/metastore/model/MConstraint.java   | 178 +++++++++++----------
 .../apache/hadoop/hive/metastore/model/MTable.java |  31 ++++
 .../src/main/resources/package.jdo                 |   6 +-
 .../src/main/sql/derby/hive-schema-4.0.0.derby.sql |  18 ++-
 .../sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql     |   5 +-
 .../src/main/sql/mssql/hive-schema-4.0.0.mssql.sql |   4 +-
 .../sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql     |   4 +
 .../src/main/sql/mysql/hive-schema-4.0.0.mysql.sql |   2 +-
 .../sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql     |   4 +
 .../main/sql/oracle/hive-schema-4.0.0.oracle.sql   |   2 +-
 .../sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql   |   5 +
 .../sql/postgres/hive-schema-4.0.0.postgres.sql    |   2 +-
 .../postgres/upgrade-3.2.0-to-4.0.0.postgres.sql   |   8 +-
 20 files changed, 321 insertions(+), 202 deletions(-)

diff --git a/metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql b/metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql
index e3f5eb9..fde6f02 100644
--- a/metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql
+++ b/metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql
@@ -900,7 +900,7 @@ CREATE EXTERNAL TABLE IF NOT EXISTS `KEY_CONSTRAINTS`
   `DELETE_RULE` string,
   `ENABLE_VALIDATE_RELY` int,
   `DEFAULT_VALUE` string,
-  CONSTRAINT `SYS_PK_KEY_CONSTRAINTS` PRIMARY KEY (`CONSTRAINT_NAME`, `POSITION`) DISABLE
+  CONSTRAINT `SYS_PK_KEY_CONSTRAINTS` PRIMARY KEY (`PARENT_TBL_ID`, `CONSTRAINT_NAME`, `POSITION`) DISABLE
 )
 STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
 TBLPROPERTIES (
diff --git a/ql/src/test/queries/clientnegative/constraint_duplicate_name.q b/ql/src/test/queries/clientnegative/constraint_duplicate_name.q
deleted file mode 100644
index 2b7429d..0000000
--- a/ql/src/test/queries/clientnegative/constraint_duplicate_name.q
+++ /dev/null
@@ -1,2 +0,0 @@
-create table t(i int constraint c1 not null enable);
-create table t1(j int constraint c1 default 4);
diff --git a/ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q b/ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q
index a0bc7f6..79d8d1a 100644
--- a/ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q
+++ b/ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q
@@ -1,2 +1,11 @@
-create table t1(x int, constraint pk1 primary key (x) disable);
-create table t2(x int, constraint pk1 primary key (x) disable);
+create database db1;
+use db1;
+create table t1(x int, constraint constraint_name primary key (x) disable);
+
+-- same constraint name in different db or different table is valid, thus only the foreign key creation should fail
+create database db2;
+use db2;
+create table t1(x int, constraint constraint_name primary key (x) disable);
+create table t2(x int, constraint constraint_name primary key (x) disable);
+
+alter table t1 add constraint constraint_name foreign key (x) references t2(x) disable novalidate rely;
diff --git a/ql/src/test/results/clientnegative/constraint_duplicate_name.q.out b/ql/src/test/results/clientnegative/constraint_duplicate_name.q.out
deleted file mode 100644
index e66e8c1..0000000
--- a/ql/src/test/results/clientnegative/constraint_duplicate_name.q.out
+++ /dev/null
@@ -1,13 +0,0 @@
-PREHOOK: query: create table t(i int constraint c1 not null enable)
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@t
-POSTHOOK: query: create table t(i int constraint c1 not null enable)
-POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@t
-PREHOOK: query: create table t1(j int constraint c1 default 4)
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@t1
-FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. InvalidObjectException(message:Constraint name already exists: c1)
diff --git a/ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out b/ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out
index 0320ebb..41ed714 100644
--- a/ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out
+++ b/ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out
@@ -1,13 +1,51 @@
-PREHOOK: query: create table t1(x int, constraint pk1 primary key (x) disable)
+PREHOOK: query: create database db1
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db1
+POSTHOOK: query: create database db1
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db1
+PREHOOK: query: use db1
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:db1
+POSTHOOK: query: use db1
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:db1
+PREHOOK: query: create table t1(x int, constraint constraint_name primary key (x) disable)
 PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@t1
-POSTHOOK: query: create table t1(x int, constraint pk1 primary key (x) disable)
+PREHOOK: Output: database:db1
+PREHOOK: Output: db1@t1
+POSTHOOK: query: create table t1(x int, constraint constraint_name primary key (x) disable)
 POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@t1
-PREHOOK: query: create table t2(x int, constraint pk1 primary key (x) disable)
+POSTHOOK: Output: database:db1
+POSTHOOK: Output: db1@t1
+PREHOOK: query: create database db2
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db2
+POSTHOOK: query: create database db2
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db2
+PREHOOK: query: use db2
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:db2
+POSTHOOK: query: use db2
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:db2
+PREHOOK: query: create table t1(x int, constraint constraint_name primary key (x) disable)
 PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@t2
-FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. InvalidObjectException(message:Constraint name already exists: pk1)
+PREHOOK: Output: database:db2
+PREHOOK: Output: db2@t1
+POSTHOOK: query: create table t1(x int, constraint constraint_name primary key (x) disable)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:db2
+POSTHOOK: Output: db2@t1
+PREHOOK: query: create table t2(x int, constraint constraint_name primary key (x) disable)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:db2
+PREHOOK: Output: db2@t2
+POSTHOOK: query: create table t2(x int, constraint constraint_name primary key (x) disable)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:db2
+POSTHOOK: Output: db2@t2
+PREHOOK: query: alter table t1 add constraint constraint_name foreign key (x) references t2(x) disable novalidate rely
+PREHOOK: type: ALTERTABLE_ADDCONSTRAINT
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. InvalidObjectException(message:Constraint name already exists: db2.t2.constraint_name)
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
index 7b7c2d7..b6de146 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
@@ -2041,7 +2041,7 @@ public class HiveMetaStore extends ThriftHiveMetastore {
       }
       if (tbl.isSetId()) {
         throw new InvalidObjectException("Id shouldn't be set but table "
-            + tbl.getDbName() + "." + tbl.getTableName() + "has the Id set to "
+            + tbl.getDbName() + "." + tbl.getTableName() + " has the Id set to "
             + tbl.getId() + ". It's a read-only option");
       }
       SkewedInfo skew = tbl.getSd().getSkewedInfo();
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 3eff37f..1a5944d 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
@@ -4596,18 +4596,19 @@ public class ObjectStore implements RawStore, Configurable {
     return -1;
   }
 
-  private  boolean constraintNameAlreadyExists(String name) {
+  private  boolean constraintNameAlreadyExists(MTable table, String constraintName) {
     boolean commited = false;
-    Query constraintExistsQuery = null;
+    Query<MConstraint> constraintExistsQuery = null;
     String constraintNameIfExists = null;
     try {
       openTransaction();
-      name = normalizeIdentifier(name);
-      constraintExistsQuery = pm.newQuery(MConstraint.class, "constraintName == name");
-      constraintExistsQuery.declareParameters("java.lang.String name");
+      constraintName = normalizeIdentifier(constraintName);
+      constraintExistsQuery = pm.newQuery(MConstraint.class,
+          "parentTable == parentTableP && constraintName == constraintNameP");
+      constraintExistsQuery.declareParameters("java.lang.Long parentTableP, java.lang.String constraintNameP");
       constraintExistsQuery.setUnique(true);
-      constraintExistsQuery.setResult("name");
-      constraintNameIfExists = (String) constraintExistsQuery.execute(name);
+      constraintExistsQuery.setResult("constraintName");
+      constraintNameIfExists = (String) constraintExistsQuery.executeWithArray(table.getId(), constraintName);
       commited = commitTransaction();
     } finally {
       rollbackAndCleanup(commited, constraintExistsQuery);
@@ -4615,14 +4616,14 @@ public class ObjectStore implements RawStore, Configurable {
     return constraintNameIfExists != null && !constraintNameIfExists.isEmpty();
   }
 
-  private String generateConstraintName(String... parameters) throws MetaException {
+  private String generateConstraintName(MTable table, String... parameters) throws MetaException {
     int hashcode = ArrayUtils.toString(parameters).hashCode() & 0xfffffff;
     int counter = 0;
     final int MAX_RETRIES = 10;
     while (counter < MAX_RETRIES) {
       String currName = (parameters.length == 0 ? "constraint_" : parameters[parameters.length-1]) +
         "_" + hashcode + "_" + System.currentTimeMillis() + "_" + (counter++);
-      if (!constraintNameAlreadyExists(currName)) {
+      if (!constraintNameAlreadyExists(table, currName)) {
         return currName;
       }
     }
@@ -4828,13 +4829,15 @@ public class ObjectStore implements RawStore, Configurable {
             // However, this scenario can be ignored for practical purposes because of
             // the uniqueness of the generated constraint name.
             if (foreignKey.getKey_seq() == 1) {
-              currentConstraintName = generateConstraintName(
-                fkTableDB, fkTableName, pkTableDB, pkTableName, pkColumnName, fkColumnName, "fk");
+              currentConstraintName = generateConstraintName(parentTable, fkTableDB, fkTableName, pkTableDB,
+                  pkTableName, pkColumnName, fkColumnName, "fk");
             }
           } else {
             currentConstraintName = normalizeIdentifier(foreignKey.getFk_name());
-            if(constraintNameAlreadyExists(currentConstraintName)) {
-              throw new InvalidObjectException("Constraint name already exists: " + currentConstraintName);
+            if (constraintNameAlreadyExists(parentTable, currentConstraintName)) {
+              String fqConstraintName = String.format("%s.%s.%s", parentTable.getDatabase().getName(),
+                  parentTable.getTableName(), currentConstraintName);
+              throw new InvalidObjectException("Constraint name already exists: " + fqConstraintName);
             }
           }
           fkNames.add(currentConstraintName);
@@ -4842,19 +4845,20 @@ public class ObjectStore implements RawStore, Configurable {
           Integer deleteRule = foreignKey.getDelete_rule();
           int enableValidateRely = (foreignKey.isEnable_cstr() ? 4 : 0) +
                   (foreignKey.isValidate_cstr() ? 2 : 0) + (foreignKey.isRely_cstr() ? 1 : 0);
+
           MConstraint mpkfk = new MConstraint(
-            currentConstraintName,
-            MConstraint.FOREIGN_KEY_CONSTRAINT,
-            foreignKey.getKey_seq(),
-            deleteRule,
-            updateRule,
-            enableValidateRely,
-            parentTable,
-            childTable,
-            parentCD,
-            childCD,
-            childIntegerIndex,
-            parentIntegerIndex
+              currentConstraintName,
+              foreignKey.getKey_seq(),
+              MConstraint.FOREIGN_KEY_CONSTRAINT,
+              deleteRule,
+              updateRule,
+              enableValidateRely,
+              parentTable,
+              childTable,
+              parentCD,
+              childCD,
+              childIntegerIndex,
+              parentIntegerIndex
           );
           mpkfks.add(mpkfk);
 
@@ -4982,29 +4986,31 @@ public class ObjectStore implements RawStore, Configurable {
       }
       if (pks.get(i).getPk_name() == null) {
         if (pks.get(i).getKey_seq() == 1) {
-          constraintName = generateConstraintName(tableDB, tableName, columnName, "pk");
+          constraintName = generateConstraintName(parentTable, tableDB, tableName, columnName, "pk");
         }
       } else {
         constraintName = normalizeIdentifier(pks.get(i).getPk_name());
-        if(constraintNameAlreadyExists(constraintName)) {
-          throw new InvalidObjectException("Constraint name already exists: " + constraintName);
+        if (constraintNameAlreadyExists(parentTable, constraintName)) {
+          String fqConstraintName = String.format("%s.%s.%s", parentTable.getDatabase().getName(),
+              parentTable.getTableName(), constraintName);
+          throw new InvalidObjectException("Constraint name already exists: " + fqConstraintName);
         }
       }
       pkNames.add(constraintName);
       int enableValidateRely = (pks.get(i).isEnable_cstr() ? 4 : 0) +
       (pks.get(i).isValidate_cstr() ? 2 : 0) + (pks.get(i).isRely_cstr() ? 1 : 0);
       MConstraint mpk = new MConstraint(
-        constraintName,
-        MConstraint.PRIMARY_KEY_CONSTRAINT,
-        pks.get(i).getKey_seq(),
-        null,
-        null,
-        enableValidateRely,
-        parentTable,
-        null,
-        parentCD,
-        null,
-        null,
+          constraintName,
+          pks.get(i).getKey_seq(),
+          MConstraint.PRIMARY_KEY_CONSTRAINT,
+          null,
+          null,
+          enableValidateRely,
+          parentTable,
+          null,
+          parentCD,
+          null,
+          null,
         parentIntegerIndex);
       mpks.add(mpk);
     }
@@ -5051,12 +5057,14 @@ public class ObjectStore implements RawStore, Configurable {
       }
       if (uks.get(i).getUk_name() == null) {
         if (uks.get(i).getKey_seq() == 1) {
-            constraintName = generateConstraintName(tableDB, tableName, columnName, "uk");
+          constraintName = generateConstraintName(parentTable, tableDB, tableName, columnName, "uk");
         }
       } else {
         constraintName = normalizeIdentifier(uks.get(i).getUk_name());
-        if(constraintNameAlreadyExists(constraintName)) {
-          throw new InvalidObjectException("Constraint name already exists: " + constraintName);
+        if (constraintNameAlreadyExists(parentTable, constraintName)) {
+          String fqConstraintName = String.format("%s.%s.%s", parentTable.getDatabase().getName(),
+              parentTable.getTableName(), constraintName);
+          throw new InvalidObjectException("Constraint name already exists: " + fqConstraintName);
         }
       }
       ukNames.add(constraintName);
@@ -5064,18 +5072,18 @@ public class ObjectStore implements RawStore, Configurable {
       int enableValidateRely = (uks.get(i).isEnable_cstr() ? 4 : 0) +
           (uks.get(i).isValidate_cstr() ? 2 : 0) + (uks.get(i).isRely_cstr() ? 1 : 0);
       MConstraint muk = new MConstraint(
-        constraintName,
-        MConstraint.UNIQUE_CONSTRAINT,
-        uks.get(i).getKey_seq(),
-        null,
-        null,
-        enableValidateRely,
-        parentTable,
-        null,
-        parentCD,
-        null,
-        null,
-        parentIntegerIndex);
+          constraintName,
+          uks.get(i).getKey_seq(),
+          MConstraint.UNIQUE_CONSTRAINT,
+          null,
+          null,
+          enableValidateRely,
+          parentTable,
+          null,
+          parentCD,
+          null,
+          null,
+          parentIntegerIndex);
       cstrs.add(muk);
     }
     pm.makePersistentAll(cstrs);
@@ -5146,11 +5154,13 @@ public class ObjectStore implements RawStore, Configurable {
       }
     }
     if (ccName == null) {
-      constraintName = generateConstraintName(tableDB, tableName, columnName, "dc");
+      constraintName = generateConstraintName(parentTable, tableDB, tableName, columnName, "dc");
     } else {
       constraintName = normalizeIdentifier(ccName);
-      if(constraintNameAlreadyExists(constraintName)) {
-        throw new InvalidObjectException("Constraint name already exists: " + constraintName);
+      if (constraintNameAlreadyExists(parentTable, constraintName)) {
+        String fqConstraintName = String.format("%s.%s.%s", parentTable.getDatabase().getName(),
+            parentTable.getTableName(), constraintName);
+        throw new InvalidObjectException("Constraint name already exists: " + fqConstraintName);
       }
     }
     nnNames.add(constraintName);
@@ -5159,8 +5169,8 @@ public class ObjectStore implements RawStore, Configurable {
         (isValidate ? 2 : 0) + (isRely ? 1 : 0);
     MConstraint muk = new MConstraint(
         constraintName,
-        constraintType,
-        1, // Not null constraint should reference a single column
+        1,
+        constraintType, // Not null constraint should reference a single column
         null,
         null,
         enableValidateRely,
@@ -5228,11 +5238,13 @@ public class ObjectStore implements RawStore, Configurable {
         }
       }
       if (nns.get(i).getNn_name() == null) {
-        constraintName = generateConstraintName(tableDB, tableName, columnName, "nn");
+        constraintName = generateConstraintName(parentTable, tableDB, tableName, columnName, "nn");
       } else {
         constraintName = normalizeIdentifier(nns.get(i).getNn_name());
-        if(constraintNameAlreadyExists(constraintName)) {
-          throw new InvalidObjectException("Constraint name already exists: " + constraintName);
+        if (constraintNameAlreadyExists(parentTable, constraintName)) {
+          String fqConstraintName = String.format("%s.%s.%s", parentTable.getDatabase().getName(),
+              parentTable.getTableName(), constraintName);
+          throw new InvalidObjectException("Constraint name already exists: " + fqConstraintName);
         }
       }
       nnNames.add(constraintName);
@@ -5240,18 +5252,18 @@ public class ObjectStore implements RawStore, Configurable {
       int enableValidateRely = (nns.get(i).isEnable_cstr() ? 4 : 0) +
           (nns.get(i).isValidate_cstr() ? 2 : 0) + (nns.get(i).isRely_cstr() ? 1 : 0);
       MConstraint muk = new MConstraint(
-        constraintName,
-        MConstraint.NOT_NULL_CONSTRAINT,
-        1, // Not null constraint should reference a single column
-        null,
-        null,
-        enableValidateRely,
-        parentTable,
-        null,
-        parentCD,
-        null,
-        null,
-        parentIntegerIndex);
+          constraintName,
+          1,
+          MConstraint.NOT_NULL_CONSTRAINT, // Not null constraint should reference a single column
+          null,
+          null,
+          enableValidateRely,
+          parentTable,
+          null,
+          parentCD,
+          null,
+          null,
+          parentIntegerIndex);
       cstrs.add(muk);
     }
     pm.makePersistentAll(cstrs);
@@ -10731,7 +10743,7 @@ public class ObjectStore implements RawStore, Configurable {
         boolean rely = (enableValidateRely & 1) != 0;
         checkConstraints.add(new SQLCheckConstraint(catName, dbName, tblName,
                                                         cols.get(currConstraint.getParentIntegerIndex()).getName(),
-                                                        currConstraint.getDefaultOrCheckValue(),
+                                                        currConstraint.getDefaultValue(),
                                                     currConstraint.getConstraintName(), enable, validate, rely));
       }
       commited = commitTransaction();
@@ -10770,7 +10782,7 @@ public class ObjectStore implements RawStore, Configurable {
         boolean validate = (enableValidateRely & 2) != 0;
         boolean rely = (enableValidateRely & 1) != 0;
         defaultConstraints.add(new SQLDefaultConstraint(catName, dbName, tblName,
-            cols.get(currConstraint.getParentIntegerIndex()).getName(), currConstraint.getDefaultOrCheckValue(),
+            cols.get(currConstraint.getParentIntegerIndex()).getName(), currConstraint.getDefaultValue(),
             currConstraint.getConstraintName(), enable, validate, rely));
       }
       commited = commitTransaction();
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java
index 47877d5..bfd5bef 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java
@@ -19,21 +19,22 @@ package org.apache.hadoop.hive.metastore.model;
 
 import java.io.Serializable;
 
+/** Representing a row in the KEY_CONSTARINTS table. */
 public class MConstraint
 {
-  String constraintName;
-  int constraintType;
-  int position;
-  Integer deleteRule;
-  Integer updateRule;
-  MTable parentTable;
-  MTable childTable;
-  MColumnDescriptor parentColumn;
-  MColumnDescriptor childColumn;
-  Integer childIntegerIndex;
-  Integer parentIntegerIndex;
-  int enableValidateRely;
-  String defaultValue;
+  private String constraintName; // Primary key of KEY_CONSTARINTS
+  private int position; // Primary key of KEY_CONSTARINTS
+  private int constraintType;
+  private Integer deleteRule;
+  private Integer updateRule;
+  private MTable parentTable; // Primary key of KEY_CONSTARINTS
+  private MTable childTable;
+  private MColumnDescriptor parentColumn;
+  private MColumnDescriptor childColumn;
+  private Integer childIntegerIndex;
+  private Integer parentIntegerIndex;
+  private int enableValidateRely;
+  private String defaultValue;
 
   // 0 - Primary Key
   // 1 - PK-FK relationship
@@ -48,18 +49,20 @@ public class MConstraint
 
   @SuppressWarnings("serial")
   public static class PK implements Serializable {
+    public MTable.PK parentTable;
     public String constraintName;
     public int position;
 
     public PK() {}
 
-    public PK(String constraintName, int position) {
+    public PK(MTable.PK parentTable, String constraintName, int position) {
+      this.parentTable = parentTable;
       this.constraintName = constraintName;
       this.position = position;
     }
 
     public String toString() {
-      return constraintName+":"+position;
+      return String.format("%s:%s:%d", parentTable.id, constraintName, position);
     }
 
     public int hashCode() {
@@ -69,7 +72,10 @@ public class MConstraint
     public boolean equals(Object other) {
       if (other != null && (other instanceof PK)) {
         PK otherPK = (PK) other;
-        return otherPK.constraintName.equals(constraintName) && otherPK.position == position;
+        return
+            otherPK.parentTable.id == parentTable.id &&
+            otherPK.constraintName.equals(constraintName) &&
+            otherPK.position == position;
       }
       return false;
     }
@@ -77,25 +83,9 @@ public class MConstraint
 
   public MConstraint() {}
 
-  public MConstraint(String constraintName, int constraintType, int position, Integer deleteRule, Integer updateRule, int enableRelyValidate, MTable parentTable,
-    MTable childTable, MColumnDescriptor parentColumn, MColumnDescriptor childColumn, Integer childIntegerIndex, Integer parentIntegerIndex) {
-   this.constraintName = constraintName;
-   this.constraintType = constraintType;
-   this.parentTable = parentTable;
-   this.childTable = childTable;
-   this.parentColumn = parentColumn;
-   this.childColumn = childColumn;
-   this.position = position;
-   this.deleteRule = deleteRule;
-   this.updateRule = updateRule;
-   this.enableValidateRely = enableRelyValidate;
-   this.childIntegerIndex = childIntegerIndex;
-   this.parentIntegerIndex = parentIntegerIndex;
-  }
-
-  public MConstraint(String constraintName, int constraintType, int position, Integer deleteRule, Integer updateRule,
-          int enableRelyValidate, MTable parentTable, MTable childTable, MColumnDescriptor parentColumn,
-          MColumnDescriptor childColumn, Integer childIntegerIndex, Integer parentIntegerIndex, String defaultValue) {
+  public MConstraint(String constraintName, int position, int constraintType, Integer deleteRule, Integer updateRule,
+      int enableRelyValidate, MTable parentTable, MTable childTable, MColumnDescriptor parentColumn,
+      MColumnDescriptor childColumn, Integer childIntegerIndex, Integer parentIntegerIndex) {
     this.constraintName = constraintName;
     this.constraintType = constraintType;
     this.parentTable = parentTable;
@@ -108,107 +98,127 @@ public class MConstraint
     this.enableValidateRely = enableRelyValidate;
     this.childIntegerIndex = childIntegerIndex;
     this.parentIntegerIndex = parentIntegerIndex;
-    this.defaultValue = defaultValue;
   }
 
-  public String getDefaultOrCheckValue() { return defaultValue; }
-
-  public void setDefaultOrCheckValue(String defaultOrCheckValue) {
-    this.defaultValue= defaultOrCheckValue;
+  public MConstraint(String constraintName, int position, int constraintType, Integer deleteRule, Integer updateRule,
+      int enableRelyValidate, MTable parentTable, MTable childTable, MColumnDescriptor parentColumn,
+      MColumnDescriptor childColumn, Integer childIntegerIndex, Integer parentIntegerIndex, String defaultValue) {
+    this.constraintName = constraintName;
+    this.constraintType = constraintType;
+    this.parentTable = parentTable;
+    this.childTable = childTable;
+    this.parentColumn = parentColumn;
+    this.childColumn = childColumn;
+    this.position = position;
+    this.deleteRule = deleteRule;
+    this.updateRule = updateRule;
+    this.enableValidateRely = enableRelyValidate;
+    this.childIntegerIndex = childIntegerIndex;
+    this.parentIntegerIndex = parentIntegerIndex;
+    this.defaultValue = defaultValue;
   }
+
   public String getConstraintName() {
     return constraintName;
   }
 
-  public void setConstraintName(String fkName) {
-    this.constraintName = fkName;
+  public void setConstraintName(String constraintName) {
+    this.constraintName = constraintName;
   }
 
-  public int getConstraintType() {
-    return constraintType;
+  public int getPosition() {
+    return position;
   }
 
-  public void setConstraintType(int ct) {
-    this.constraintType = ct;
+  public void setPosition(int position) {
+    this.position = position;
   }
 
-  public int getPosition() {
-    return position;
+  public int getConstraintType() {
+    return constraintType;
   }
 
-  public void setPosition(int po) {
-    this.position = po;
+  public void setConstraintType(int constraintType) {
+    this.constraintType = constraintType;
   }
 
   public Integer getDeleteRule() {
     return deleteRule;
   }
 
-  public void setDeleteRule(Integer de) {
-    this.deleteRule = de;
+  public void setDeleteRule(Integer deleteRule) {
+    this.deleteRule = deleteRule;
   }
 
-  public int getEnableValidateRely() {
-    return enableValidateRely;
+  public Integer getUpdateRule() {
+    return updateRule;
   }
 
-  public void setEnableValidateRely(int enableValidateRely) {
-    this.enableValidateRely = enableValidateRely;
+  public void setUpdateRule(Integer updateRule) {
+    this.updateRule = updateRule;
   }
 
-  public Integer getChildIntegerIndex() {
-    return childIntegerIndex;
+  public MTable getParentTable() {
+    return parentTable;
   }
 
-  public void setChildIntegerIndex(Integer childIntegerIndex) {
-    this.childIntegerIndex = childIntegerIndex;
+  public void setParentTable(MTable parentTable) {
+    this.parentTable = parentTable;
   }
 
-  public Integer getParentIntegerIndex() {
-    return parentIntegerIndex;
+  public MTable getChildTable() {
+    return childTable;
   }
 
-  public void setParentIntegerIndex(Integer parentIntegerIndex) {
-    this.parentIntegerIndex = parentIntegerIndex;
+  public void setChildTable(MTable childTable) {
+    this.childTable = childTable;
   }
 
-  public Integer getUpdateRule() {
-    return updateRule;
+  public MColumnDescriptor getParentColumn() {
+    return parentColumn;
   }
 
-  public void setUpdateRule(Integer ur) {
-    this.updateRule = ur;
+  public void setParentColumn(MColumnDescriptor parentColumn) {
+    this.parentColumn = parentColumn;
   }
 
-  public MTable getChildTable() {
-    return childTable;
+  public MColumnDescriptor getChildColumn() {
+    return childColumn;
   }
 
-  public void setChildTable(MTable ft) {
-    this.childTable = ft;
+  public void setChildColumn(MColumnDescriptor childColumn) {
+    this.childColumn = childColumn;
   }
 
-  public MTable getParentTable() {
-    return parentTable;
+  public Integer getChildIntegerIndex() {
+    return childIntegerIndex;
   }
 
-  public void setParentTable(MTable pt) {
-    this.parentTable = pt;
+  public void setChildIntegerIndex(Integer childIntegerIndex) {
+    this.childIntegerIndex = childIntegerIndex;
   }
 
-  public MColumnDescriptor getParentColumn() {
-    return parentColumn;
+  public Integer getParentIntegerIndex() {
+    return parentIntegerIndex;
   }
 
-  public void setParentColumn(MColumnDescriptor name) {
-    this.parentColumn = name;
+  public void setParentIntegerIndex(Integer parentIntegerIndex) {
+    this.parentIntegerIndex = parentIntegerIndex;
   }
 
-  public MColumnDescriptor getChildColumn() {
-    return childColumn;
+  public int getEnableValidateRely() {
+    return enableValidateRely;
+  }
+
+  public void setEnableValidateRely(int enableValidateRely) {
+    this.enableValidateRely = enableValidateRely;
   }
 
-  public void setChildColumn(MColumnDescriptor name) {
-    this.childColumn = name;
+  public String getDefaultValue() {
+    return defaultValue;
+  }
+
+  public void setDefaultValue(String defaultValue) {
+    this.defaultValue = defaultValue;
   }
 }
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java
index 92182ae..647425a 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java
@@ -19,9 +19,12 @@
 
 package org.apache.hadoop.hive.metastore.model;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hadoop.hive.metastore.model.MConstraint.PK;
+
 public class MTable {
 
   private long id;
@@ -41,6 +44,34 @@ public class MTable {
   private String tableType;
   private long writeId;
 
+  @SuppressWarnings("serial")
+  public static class PK implements Serializable {
+    public long id;
+
+    public PK() {}
+
+    public PK(long id) {
+      this.id = id;
+    }
+
+    public String toString() {
+      return String.format("%d", id);
+    }
+
+    public int hashCode() {
+      return toString().hashCode();
+    }
+
+    public boolean equals(Object other) {
+      if (other != null && (other instanceof PK)) {
+        PK otherPK = (PK) other;
+        return
+            otherPK.id == id;
+      }
+      return false;
+    }
+  }
+
   public MTable() {}
 
   /**
diff --git a/standalone-metastore/metastore-server/src/main/resources/package.jdo b/standalone-metastore/metastore-server/src/main/resources/package.jdo
index 2190ef0..ce919e4 100644
--- a/standalone-metastore/metastore-server/src/main/resources/package.jdo
+++ b/standalone-metastore/metastore-server/src/main/resources/package.jdo
@@ -139,7 +139,7 @@
       </field>
     </class>
 
-    <class name="MTable" table="TBLS" identity-type="application" detachable="true">
+    <class name="MTable" table="TBLS" identity-type="application" detachable="true" objectid-class="MTable$PK">
       <field name="id" primary-key="true" value-strategy="native">
         <column name="TBL_ID" jdbc-type="BIGINT" />
       </field>
@@ -273,9 +273,9 @@
         <column name="PARENT_CD_ID"/>
       </field>
       <field name="parentIntegerIndex">
-    <column name="PARENT_INTEGER_IDX"/>
+        <column name="PARENT_INTEGER_IDX"/>
       </field>
-      <field name="parentTable">
+      <field name="parentTable" primary-key="true">
         <column name="PARENT_TBL_ID"/>
       </field>
       <field name="constraintType">
diff --git a/standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql b/standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql
index 3be5707..482d8aa 100644
--- a/standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql
@@ -183,7 +183,21 @@ CREATE UNIQUE INDEX "APP"."NOTIFICATION_LOG_EVENT_ID" ON "APP"."NOTIFICATION_LOG
 
 CREATE TABLE "APP"."NOTIFICATION_SEQUENCE" ("NNI_ID" BIGINT NOT NULL, "NEXT_EVENT_ID" BIGINT NOT NULL);
 
-CREATE TABLE "APP"."KEY_CONSTRAINTS" ("CHILD_CD_ID" BIGINT, "CHILD_INTEGER_IDX" INTEGER, "CHILD_TBL_ID" BIGINT, "PARENT_CD_ID" BIGINT , "PARENT_INTEGER_IDX" INTEGER, "PARENT_TBL_ID" BIGINT NOT NULL,  "POSITION" BIGINT NOT NULL, "CONSTRAINT_NAME" VARCHAR(400) NOT NULL, "CONSTRAINT_TYPE" SMALLINT NOT NULL, "UPDATE_RULE" SMALLINT, "DELETE_RULE" SMALLINT, "ENABLE_VALIDATE_RELY" SMALLINT NOT NULL, "DEFAULT_VALUE" VARCHAR(400));
+CREATE TABLE "APP"."KEY_CONSTRAINTS" (
+    "CHILD_CD_ID" BIGINT,
+    "CHILD_INTEGER_IDX" INTEGER,
+    "CHILD_TBL_ID" BIGINT,
+    "PARENT_CD_ID" BIGINT,
+    "PARENT_INTEGER_IDX" INTEGER,
+    "PARENT_TBL_ID" BIGINT NOT NULL,
+    "POSITION" BIGINT NOT NULL,
+    "CONSTRAINT_NAME" VARCHAR(400) NOT NULL,
+    "CONSTRAINT_TYPE" SMALLINT NOT NULL,
+    "UPDATE_RULE" SMALLINT,
+    "DELETE_RULE" SMALLINT,
+    "ENABLE_VALIDATE_RELY" SMALLINT NOT NULL,
+    "DEFAULT_VALUE" VARCHAR(400)
+);
 
 CREATE TABLE "APP"."METASTORE_DB_PROPERTIES" ("PROPERTY_KEY" VARCHAR(255) NOT NULL, "PROPERTY_VALUE" VARCHAR(1000) NOT NULL, "DESCRIPTION" VARCHAR(1000));
 
@@ -377,7 +391,7 @@ ALTER TABLE "APP"."NOTIFICATION_LOG" ADD CONSTRAINT "NOTIFICATION_LOG_PK" PRIMAR
 
 ALTER TABLE "APP"."NOTIFICATION_SEQUENCE" ADD CONSTRAINT "NOTIFICATION_SEQUENCE_PK" PRIMARY KEY ("NNI_ID");
 
-ALTER TABLE "APP"."KEY_CONSTRAINTS" ADD CONSTRAINT "CONSTRAINTS_PK" PRIMARY KEY ("CONSTRAINT_NAME", "POSITION");
+ALTER TABLE "APP"."KEY_CONSTRAINTS" ADD CONSTRAINT "CONSTRAINTS_PK" PRIMARY KEY ("PARENT_TBL_ID", "CONSTRAINT_NAME", "POSITION");
 
 ALTER TABLE "APP"."METASTORE_DB_PROPERTIES" ADD CONSTRAINT "PROPERTY_KEY_PK" PRIMARY KEY ("PROPERTY_KEY");
 
diff --git a/standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql b/standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql
index a7d8da4..6fd8ae6 100644
--- a/standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql
@@ -52,7 +52,10 @@ CREATE UNIQUE INDEX SCHEDULED_EXECUTIONS_UNIQUE_ID ON APP.SCHEDULED_EXECUTIONS (
 ALTER TABLE COMPACTION_QUEUE ADD CQ_ERROR_MESSAGE clob;
 ALTER TABLE COMPLETED_COMPACTIONS ADD CC_ERROR_MESSAGE clob;
 
+-- HIVE-22728
+ALTER TABLE "APP"."KEY_CONSTRAINTS" DROP CONSTRAINT "CONSTRAINTS_PK";
+ALTER TABLE "APP"."KEY_CONSTRAINTS" ADD CONSTRAINT "CONSTRAINTS_PK" PRIMARY KEY ("PARENT_TBL_ID", "CONSTRAINT_NAME", "POSITION");
+
 -- This needs to be the last thing done.  Insert any changes above this line.
 UPDATE "APP".VERSION SET SCHEMA_VERSION='4.0.0', VERSION_COMMENT='Hive release version 4.0.0' where VER_ID=1;
 
-
diff --git a/standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql b/standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql
index 29b7b3f..dfd4bd6 100644
--- a/standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql
@@ -1151,9 +1151,9 @@ CREATE TABLE KEY_CONSTRAINTS
   DELETE_RULE SMALLINT,
   ENABLE_VALIDATE_RELY SMALLINT NOT NULL,
   DEFAULT_VALUE VARCHAR(400)
-) ;
+);
 
-ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (CONSTRAINT_NAME, POSITION);
+ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (PARENT_TBL_ID, CONSTRAINT_NAME, POSITION);
 
 CREATE INDEX CONSTRAINTS_PARENT_TBL_ID__INDEX ON KEY_CONSTRAINTS(PARENT_TBL_ID);
 
diff --git a/standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql b/standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql
index 72733c9..fecfca8 100644
--- a/standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql
@@ -26,6 +26,10 @@ UPDATE PART_COL_STATS SET ENGINE = 'hive' WHERE ENGINE IS NULL;
 ALTER TABLE COMPACTION_QUEUE ADD CQ_ERROR_MESSAGE varchar(max) NULL;
 ALTER TABLE COMPLETED_COMPACTIONS ADD CC_ERROR_MESSAGE varchar(max) NULL;
 
+-- HIVE-22728
+ALTER TABLE KEY_CONSTRAINTS DROP CONSTRAINT CONSTRAINTS_PK;
+ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (PARENT_TBL_ID, CONSTRAINT_NAME, POSITION);
+
 -- These lines need to be last.  Insert any changes above.
 UPDATE VERSION SET SCHEMA_VERSION='4.0.0', VERSION_COMMENT='Hive release version 4.0.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 3.2.0 to 4.0.0' AS MESSAGE;
diff --git a/standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql b/standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql
index 69e2cef..a9a0930 100644
--- a/standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql
@@ -901,7 +901,7 @@ CREATE TABLE IF NOT EXISTS `KEY_CONSTRAINTS`
   `DELETE_RULE` SMALLINT(6),
   `ENABLE_VALIDATE_RELY` SMALLINT(6) NOT NULL,
   `DEFAULT_VALUE` VARCHAR(400),
-  PRIMARY KEY (`CONSTRAINT_NAME`, `POSITION`)
+  PRIMARY KEY (`PARENT_TBL_ID`, `CONSTRAINT_NAME`, `POSITION`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 CREATE INDEX `CONSTRAINTS_PARENT_TABLE_ID_INDEX` ON KEY_CONSTRAINTS (`PARENT_TBL_ID`) USING BTREE;
diff --git a/standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql b/standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql
index c81d08a..70b5d9d 100644
--- a/standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql
@@ -56,6 +56,10 @@ CREATE UNIQUE INDEX UNIQUE_SCHEDULED_EXECUTIONS_ID ON SCHEDULED_EXECUTIONS (SCHE
 ALTER TABLE COMPACTION_QUEUE ADD CQ_ERROR_MESSAGE mediumtext;
 ALTER TABLE COMPLETED_COMPACTIONS ADD CC_ERROR_MESSAGE mediumtext;
 
+-- HIVE-22728
+ALTER TABLE `KEY_CONSTRAINTS` DROP PRIMARY KEY;
+ALTER TABLE `KEY_CONSTRAINTS` ADD CONSTRAINT `CONSTRAINTS_PK` PRIMARY KEY (`PARENT_TBL_ID`, `CONSTRAINT_NAME`, `POSITION`);
+
 -- These lines need to be last.  Insert any changes above.
 UPDATE VERSION SET SCHEMA_VERSION='4.0.0', VERSION_COMMENT='Hive release version 4.0.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 3.2.0 to 4.0.0' AS MESSAGE;
diff --git a/standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql b/standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql
index cb95a42..f90d76b 100644
--- a/standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql
@@ -923,7 +923,7 @@ CREATE TABLE KEY_CONSTRAINTS
   DEFAULT_VALUE VARCHAR(400)
 ) ;
 
-ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (CONSTRAINT_NAME, POSITION);
+ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (PARENT_TBL_ID, CONSTRAINT_NAME, POSITION);
 
 CREATE INDEX CONSTRAINTS_PT_INDEX ON KEY_CONSTRAINTS(PARENT_TBL_ID);
 
diff --git a/standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql b/standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql
index 65057be..9f1b980 100644
--- a/standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql
@@ -56,6 +56,11 @@ CREATE INDEX IDX_SCHEDULED_EX_SQ_ID ON "SCHEDULED_EXECUTIONS" ("SCHEDULED_QUERY_
 ALTER TABLE COMPACTION_QUEUE ADD CQ_ERROR_MESSAGE CLOB;
 ALTER TABLE COMPLETED_COMPACTIONS ADD CC_ERROR_MESSAGE CLOB;
 
+-- HIVE-22728
+ALTER TABLE KEY_CONSTRAINTS DROP CONSTRAINT CONSTRAINTS_PK;
+ALTER TABLE KEY_CONSTRAINTS ADD CONSTRAINT CONSTRAINTS_PK PRIMARY KEY (PARENT_TBL_ID, CONSTRAINT_NAME, POSITION);
+
 -- These lines need to be last.  Insert any changes above.
 UPDATE VERSION SET SCHEMA_VERSION='4.0.0', VERSION_COMMENT='Hive release version 4.0.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 3.2.0 to 4.0.0' AS Status from dual;
+
diff --git a/standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql b/standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql
index 0fcb88a..b992d7a 100644
--- a/standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql
@@ -662,7 +662,7 @@ CREATE TABLE "KEY_CONSTRAINTS"
   "DELETE_RULE"	SMALLINT,
   "ENABLE_VALIDATE_RELY" SMALLINT NOT NULL,
   "DEFAULT_VALUE" VARCHAR(400),
-  PRIMARY KEY ("CONSTRAINT_NAME", "POSITION")
+  CONSTRAINT CONSTRAINTS_PK PRIMARY KEY ("PARENT_TBL_ID", "CONSTRAINT_NAME", "POSITION")
 ) ;
 
 ---
diff --git a/standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql b/standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql
index 2347c69..f9af248 100644
--- a/standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql
+++ b/standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql
@@ -184,8 +184,12 @@ ALTER TABLE "WRITE_SET" RENAME COLUMN ws_commit_id TO "WS_COMMIT_ID";
 ALTER TABLE "WRITE_SET" RENAME COLUMN ws_operation_type TO "WS_OPERATION_TYPE";
 
 -- HIVE-22729
-ALTER TABLE COMPACTION_QUEUE ADD CQ_ERROR_MESSAGE clob;
-ALTER TABLE COMPLETED_COMPACTIONS ADD CC_ERROR_MESSAGE clob;
+ALTER TABLE "COMPACTION_QUEUE" ADD "CQ_ERROR_MESSAGE" text;
+ALTER TABLE "COMPLETED_COMPACTIONS" ADD "CC_ERROR_MESSAGE" text;
+
+-- HIVE-22728
+ALTER TABLE "KEY_CONSTRAINTS" DROP CONSTRAINT "KEY_CONSTRAINTS_pkey";
+ALTER TABLE "KEY_CONSTRAINTS" ADD CONSTRAINT "CONSTRAINTS_PK" PRIMARY KEY ("PARENT_TBL_ID", "CONSTRAINT_NAME", "POSITION");
 
 -- These lines need to be last. Insert any changes above.
 UPDATE "VERSION" SET "SCHEMA_VERSION"='4.0.0', "VERSION_COMMENT"='Hive release version 4.0.0' where "VER_ID"=1;