diff --git metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql index e3f5eb9386..fde6f022ac 100644 --- metastore/scripts/upgrade/hive/hive-schema-4.0.0.hive.sql +++ 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 ql/src/test/queries/clientnegative/constraint_duplicate_name.q ql/src/test/queries/clientnegative/constraint_duplicate_name.q deleted file mode 100644 index 2b7429dc80..0000000000 --- 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 ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q index a0bc7f6142..79d8d1a553 100644 --- ql/src/test/queries/clientnegative/create_with_constraints_duplicate_name.q +++ 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 ql/src/test/results/clientnegative/constraint_duplicate_name.q.out ql/src/test/results/clientnegative/constraint_duplicate_name.q.out deleted file mode 100644 index e66e8c13f8..0000000000 --- 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 ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out index 0320ebb9ae..41ed7146a1 100644 --- ql/src/test/results/clientnegative/create_with_constraints_duplicate_name.q.out +++ 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 standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 7b7c2d7791..b6de1460a5 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -2041,7 +2041,7 @@ private void create_table_core(final RawStore ms, final CreateTableRequest req) } 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 standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java index 3eff37f041..1a5944d33e 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -4596,18 +4596,19 @@ private static int getColumnIndexFromTableColumns(List cols, Strin return -1; } - private boolean constraintNameAlreadyExists(String name) { + private boolean constraintNameAlreadyExists(MTable table, String constraintName) { boolean commited = false; - Query constraintExistsQuery = null; + Query 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 @@ private boolean constraintNameAlreadyExists(String name) { 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 @@ private String getGuidFromDB() throws MetaException { // 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 @@ private String getGuidFromDB() throws MetaException { 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 @@ private static String generateColNameTypeSignature(String colName, String colTyp } 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 @@ private static String generateColNameTypeSignature(String colName, String colTyp } 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 @@ private static String generateColNameTypeSignature(String colName, String colTyp 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 @@ private void addConstraint(String catName, String tableDB, String tableName, Str } } 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 @@ private void addConstraint(String catName, String tableDB, String tableName, Str (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 @@ private void addConstraint(String catName, String tableDB, String tableName, Str } } 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 @@ private void addConstraint(String catName, String tableDB, String tableName, Str 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 @@ private String getPrimaryKeyConstraintName(String catName, String dbName, String 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 @@ private String getPrimaryKeyConstraintName(String catName, String dbName, String 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 standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java index 47877d5651..bfd5befd56 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MConstraint.java @@ -19,21 +19,22 @@ 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 @@ @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 int hashCode() { 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 boolean equals(Object other) { 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 MConstraint(String constraintName, int constraintType, int position, Inte 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 standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java index 92182ae257..647425a1ba 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/model/MTable.java +++ 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 @@ 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 standalone-metastore/metastore-server/src/main/resources/package.jdo standalone-metastore/metastore-server/src/main/resources/package.jdo index 2190ef02ef..ce919e4c4e 100644 --- standalone-metastore/metastore-server/src/main/resources/package.jdo +++ standalone-metastore/metastore-server/src/main/resources/package.jdo @@ -139,7 +139,7 @@ - + @@ -273,9 +273,9 @@ - + - + diff --git standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql index 3be5707fa0..482d8aa163 100644 --- standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql index a7d8da4e1c..6fd8ae64cb 100644 --- standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql index 29b7b3f746..dfd4bd6672 100644 --- standalone-metastore/metastore-server/src/main/sql/mssql/hive-schema-4.0.0.mssql.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql index 72733c98ba..fecfca8c13 100644 --- standalone-metastore/metastore-server/src/main/sql/mssql/upgrade-3.2.0-to-4.0.0.mssql.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql index 69e2cef57d..a9a09307ee 100644 --- standalone-metastore/metastore-server/src/main/sql/mysql/hive-schema-4.0.0.mysql.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql index c81d08a324..70b5d9d41f 100644 --- standalone-metastore/metastore-server/src/main/sql/mysql/upgrade-3.2.0-to-4.0.0.mysql.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql index cb95a42499..f90d76b4e0 100644 --- standalone-metastore/metastore-server/src/main/sql/oracle/hive-schema-4.0.0.oracle.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql index 65057be688..9f1b980372 100644 --- standalone-metastore/metastore-server/src/main/sql/oracle/upgrade-3.2.0-to-4.0.0.oracle.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql index 0fcb88aeb3..b992d7a249 100644 --- standalone-metastore/metastore-server/src/main/sql/postgres/hive-schema-4.0.0.postgres.sql +++ 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 standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql index 2347c697db..f9af248e27 100644 --- standalone-metastore/metastore-server/src/main/sql/postgres/upgrade-3.2.0-to-4.0.0.postgres.sql +++ 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;