From 55ab718da70aee2ff4c37a79584fa0aa9ecea76d Mon Sep 17 00:00:00 2001 From: Jun Yuan Date: Tue, 20 Jul 2021 11:37:31 -0700 Subject: [PATCH] DB-12363: fix drop column and constraints --- .../ModifyColumnConstantOperation.java | 12 ++++----- .../sql/execute/operations/DropColumnIT.java | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/execute/actions/ModifyColumnConstantOperation.java b/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/execute/actions/ModifyColumnConstantOperation.java index d35b6c6beac..f69e63cc9ea 100644 --- a/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/execute/actions/ModifyColumnConstantOperation.java +++ b/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/execute/actions/ModifyColumnConstantOperation.java @@ -768,7 +768,7 @@ private void dropColumnFromTable(Activation activation, int maxStoragePosition = tableDescriptor.getColumnDescriptorList().maxStoragePosition(); int size = tableDescriptor.getColumnDescriptorList().size(); int droppedColumnPosition = columnDescriptor.getPosition(); - + int droppedStoragePosition = columnDescriptor.getStoragePosition(); FormatableBitSet toDrop = new FormatableBitSet(maxStoragePosition + 1); toDrop.set(droppedColumnPosition); tableDescriptor.setReferencedColumnMap(toDrop); @@ -786,7 +786,7 @@ private void dropColumnFromTable(Activation activation, // Now handle constraints List newCongloms = handleConstraints(activation, tableDescriptor, columnName, lcc, dd, dm, cascade, tc, - droppedColumnPosition); + droppedStoragePosition); /* If there are new backing conglomerates which must be * created to replace a dropped shared conglomerate @@ -945,7 +945,7 @@ private List handleConstraints(Activation activation, DependencyManager dm, boolean cascade, TransactionController tc, - int droppedColumnPosition) throws StandardException { + int droppedStoragePosition) throws StandardException { ConstraintDescriptorList csdl = dd.getConstraintDescriptors(td); int csdl_size = csdl.size(); @@ -964,16 +964,16 @@ private List handleConstraints(Activation activation, int numRefCols = referencedColumns.length, j; boolean changed = false; for (j = 0; j < numRefCols; j++) { - if (referencedColumns[j] > droppedColumnPosition) + if (referencedColumns[j] > droppedStoragePosition) changed = true; - if (referencedColumns[j] == droppedColumnPosition) + if (referencedColumns[j] == droppedStoragePosition) break; } if (j == numRefCols) {// column not referenced if ((cd instanceof CheckConstraintDescriptor) && changed) { dd.dropConstraintDescriptor(cd, tc); for (j = 0; j < numRefCols; j++) { - if (referencedColumns[j] > droppedColumnPosition) + if (referencedColumns[j] > droppedStoragePosition) referencedColumns[j]--; } ((CheckConstraintDescriptor) cd).setReferencedColumnsDescriptor(new ReferencedColumnsDescriptorImpl(referencedColumns)); diff --git a/splice_machine/src/test/java/com/splicemachine/derby/impl/sql/execute/operations/DropColumnIT.java b/splice_machine/src/test/java/com/splicemachine/derby/impl/sql/execute/operations/DropColumnIT.java index 8dacde23228..2802d52d631 100644 --- a/splice_machine/src/test/java/com/splicemachine/derby/impl/sql/execute/operations/DropColumnIT.java +++ b/splice_machine/src/test/java/com/splicemachine/derby/impl/sql/execute/operations/DropColumnIT.java @@ -386,4 +386,30 @@ public void testCascadeDropTrigger() throws Exception { assertEquals(0, count); } } + + @Test + public void testCascadeDropConstraint() throws Exception { + methodWatcher.execute("create table t6(c1 int)"); + methodWatcher.execute("alter table t6 add c2 float"); + methodWatcher.execute("alter table t6 drop c2"); + methodWatcher.execute("alter table t6 add c3 float not null default 1 constraint con3 primary key"); + + try(Connection conn = methodWatcher.getOrCreateConnection(); + Statement s = conn.createStatement()) { + s.execute("alter table t6 drop c3"); + SQLWarning warning = s.getWarnings(); + Assert.assertTrue(warning!=null); + Assert.assertEquals("01500", warning.getSQLState()); + } + + String sql = String.format("select count(*) from sys.sysprimarykeys where conglomerateid=(" + + "select conglomerateid from sys.sysconglomerates c, sys.sysschemas s, sys.systables t " + + "where s.schemaid=t.schemaid and t.tableid=c.tableid and s.schemaname='%s' and t.tablename='T6')", + SCHEMA_NAME); + try(ResultSet rs = methodWatcher.executeQuery(sql)) { + rs.next(); + int count = rs.getInt(1); + Assert.assertEquals(0, count); + } + } }