Skip to content

Commit 18a48c8

Browse files
committed
Add drop column
1 parent f572730 commit 18a48c8

File tree

15 files changed

+378
-0
lines changed

15 files changed

+378
-0
lines changed

core/src/main/java/com/scalar/db/api/Admin.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,18 @@ default void addNewColumnToTable(
441441
}
442442
}
443443

444+
/**
445+
* Drops a column from an existing table. The column cannot be a partition or clustering key.
446+
*
447+
* @param namespace the table namespace
448+
* @param table the table name
449+
* @param columnName the name of the column to drop
450+
* @throws IllegalArgumentException if the table does not exist or the column does not exist
451+
* @throws ExecutionException if the operation fails
452+
*/
453+
void dropColumnFromTable(String namespace, String table, String columnName)
454+
throws ExecutionException;
455+
444456
/**
445457
* Imports an existing table that is not managed by ScalarDB.
446458
*

core/src/main/java/com/scalar/db/common/CheckedDistributedStorageAdmin.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,39 @@ public void addNewColumnToTable(
295295
}
296296
}
297297

298+
@Override
299+
public void dropColumnFromTable(String namespace, String table, String columnName)
300+
throws ExecutionException {
301+
TableMetadata tableMetadata = getTableMetadata(namespace, table);
302+
if (tableMetadata == null) {
303+
throw new IllegalArgumentException(
304+
CoreError.TABLE_NOT_FOUND.buildMessage(ScalarDbUtils.getFullTableName(namespace, table)));
305+
}
306+
307+
if (!tableMetadata.getColumnNames().contains(columnName)) {
308+
throw new IllegalArgumentException(
309+
CoreError.COLUMN_NOT_FOUND2.buildMessage(
310+
ScalarDbUtils.getFullTableName(namespace, table), columnName));
311+
}
312+
313+
if (tableMetadata.getPartitionKeyNames().contains(columnName)
314+
|| tableMetadata.getClusteringKeyNames().contains(columnName)
315+
|| tableMetadata.getSecondaryIndexNames().contains(columnName)) {
316+
throw new IllegalArgumentException(
317+
CoreError.COLUMN_SPECIFIED_AS_PRIMARY_KEY_OR_INDEX_KEY.buildMessage(
318+
ScalarDbUtils.getFullTableName(namespace, table), columnName));
319+
}
320+
321+
try {
322+
admin.dropColumnFromTable(namespace, table, columnName);
323+
} catch (ExecutionException e) {
324+
throw new ExecutionException(
325+
CoreError.DROPPING_COLUMN_FROM_TABLE_FAILED.buildMessage(
326+
ScalarDbUtils.getFullTableName(namespace, table), columnName),
327+
e);
328+
}
329+
}
330+
298331
@Override
299332
public Set<String> getNamespaceNames() throws ExecutionException {
300333
try {

core/src/main/java/com/scalar/db/common/CoreError.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,12 @@ public enum CoreError implements ScalarDbError {
678678
"Mutations across multiple storages are not allowed. Mutations: %s",
679679
"",
680680
""),
681+
COLUMN_SPECIFIED_AS_PRIMARY_KEY_OR_INDEX_KEY(
682+
Category.USER_ERROR,
683+
"0216",
684+
"The column %s is specified as a primary key or an index key",
685+
"",
686+
""),
681687

682688
//
683689
// Errors for the concurrency error category
@@ -960,6 +966,12 @@ public enum CoreError implements ScalarDbError {
960966
Category.INTERNAL_ERROR, "0057", "Recovering records failed. Details: %s", "", ""),
961967
CONSENSUS_COMMIT_COMMITTING_RECORDS_FAILED(
962968
Category.INTERNAL_ERROR, "0058", "Committing records failed. Details: %s", "", ""),
969+
DROPPING_COLUMN_FROM_TABLE_FAILED(
970+
Category.INTERNAL_ERROR,
971+
"0059",
972+
"Dropping a column from the table failed. Table: %s; Column: %s",
973+
"",
974+
""),
963975

964976
//
965977
// Errors for the unknown transaction status error category

core/src/main/java/com/scalar/db/common/DecoratedDistributedTransactionAdmin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ public void addNewColumnToTable(
195195
namespace, table, columnName, columnType, encrypted);
196196
}
197197

198+
@Override
199+
public void dropColumnFromTable(String namespace, String table, String columnName)
200+
throws ExecutionException {
201+
distributedTransactionAdmin.dropColumnFromTable(namespace, table, columnName);
202+
}
203+
198204
@Override
199205
public void importTable(String namespace, String table, Map<String, String> options)
200206
throws ExecutionException {

core/src/main/java/com/scalar/db/service/AdminService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ public void addNewColumnToTable(
9494
admin.addNewColumnToTable(namespace, table, columnName, columnType);
9595
}
9696

97+
@Override
98+
public void dropColumnFromTable(String namespace, String table, String columnName)
99+
throws ExecutionException {
100+
admin.dropColumnFromTable(namespace, table, columnName);
101+
}
102+
97103
@Override
98104
public TableMetadata getImportTableMetadata(
99105
String namespace, String table, Map<String, DataType> overrideColumnsType)

core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,27 @@ columnName, getFullTableName(namespace, table)),
415415
}
416416
}
417417

418+
@Override
419+
public void dropColumnFromTable(String namespace, String table, String columnName)
420+
throws ExecutionException {
421+
try {
422+
String alterTableQuery =
423+
SchemaBuilder.alterTable(quoteIfNecessary(namespace), quoteIfNecessary(table))
424+
.dropColumn(columnName)
425+
.getQueryString();
426+
427+
clusterManager.getSession().execute(alterTableQuery);
428+
} catch (IllegalArgumentException e) {
429+
throw e;
430+
} catch (RuntimeException e) {
431+
throw new ExecutionException(
432+
String.format(
433+
"Dropping the %s column from the %s table failed",
434+
columnName, getFullTableName(namespace, table)),
435+
e);
436+
}
437+
}
438+
418439
@Override
419440
public Set<String> getNamespaceNames() throws ExecutionException {
420441
try {

core/src/main/java/com/scalar/db/storage/cosmos/CosmosAdmin.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,23 @@ columnName, getFullTableName(namespace, table)),
644644
}
645645
}
646646

647+
@Override
648+
public void dropColumnFromTable(String namespace, String table, String columnName)
649+
throws ExecutionException {
650+
try {
651+
TableMetadata currentTableMetadata = getTableMetadata(namespace, table);
652+
TableMetadata updatedTableMetadata =
653+
TableMetadata.newBuilder(currentTableMetadata).removeColumn(columnName).build();
654+
upsertTableMetadata(namespace, table, updatedTableMetadata);
655+
} catch (ExecutionException e) {
656+
throw new ExecutionException(
657+
String.format(
658+
"Adding the new %s column to the %s container failed",
659+
columnName, getFullTableName(namespace, table)),
660+
e);
661+
}
662+
}
663+
647664
@Override
648665
public TableMetadata getImportTableMetadata(
649666
String namespace, String table, Map<String, DataType> overrideColumnsType) {

core/src/main/java/com/scalar/db/storage/dynamo/DynamoAdmin.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,6 +1440,25 @@ columnName, getFullTableName(namespace, table)),
14401440
}
14411441
}
14421442

1443+
@Override
1444+
public void dropColumnFromTable(String nonPrefixedNamespace, String table, String columnName)
1445+
throws ExecutionException {
1446+
Namespace namespace = Namespace.of(namespacePrefix, nonPrefixedNamespace);
1447+
try {
1448+
TableMetadata currentTableMetadata = getTableMetadata(nonPrefixedNamespace, table);
1449+
TableMetadata updatedTableMetadata =
1450+
TableMetadata.newBuilder(currentTableMetadata).removeColumn(columnName).build();
1451+
1452+
upsertTableMetadata(namespace, table, updatedTableMetadata);
1453+
} catch (ExecutionException e) {
1454+
throw new ExecutionException(
1455+
String.format(
1456+
"Dropping the %s column from the %s table failed",
1457+
columnName, getFullTableName(namespace, table)),
1458+
e);
1459+
}
1460+
}
1461+
14431462
@Override
14441463
public TableMetadata getImportTableMetadata(
14451464
String namespace, String table, Map<String, DataType> overrideColumnsType) {

core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,31 @@ columnName, getFullTableName(namespace, table)),
861861
}
862862
}
863863

864+
@Override
865+
public void dropColumnFromTable(String namespace, String table, String columnName)
866+
throws ExecutionException {
867+
try {
868+
TableMetadata currentTableMetadata = getTableMetadata(namespace, table);
869+
TableMetadata updatedTableMetadata =
870+
TableMetadata.newBuilder(currentTableMetadata).removeColumn(columnName).build();
871+
String addNewColumnStatement =
872+
"ALTER TABLE "
873+
+ encloseFullTableName(namespace, table)
874+
+ " DROP COLUMN"
875+
+ enclose(columnName);
876+
try (Connection connection = dataSource.getConnection()) {
877+
execute(connection, addNewColumnStatement);
878+
addTableMetadata(connection, namespace, table, updatedTableMetadata, false, true);
879+
}
880+
} catch (SQLException e) {
881+
throw new ExecutionException(
882+
String.format(
883+
"Adding the new %s column to the %s table failed",
884+
columnName, getFullTableName(namespace, table)),
885+
e);
886+
}
887+
}
888+
864889
@Override
865890
public void addRawColumnToTable(
866891
String namespace, String table, String columnName, DataType columnType)

core/src/main/java/com/scalar/db/storage/multistorage/MultiStorageAdmin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ public void addNewColumnToTable(
205205
getAdmin(namespace, table).addNewColumnToTable(namespace, table, columnName, columnType);
206206
}
207207

208+
@Override
209+
public void dropColumnFromTable(String namespace, String table, String columnName)
210+
throws ExecutionException {
211+
getAdmin(namespace, table).dropColumnFromTable(namespace, table, columnName);
212+
}
213+
208214
@Override
209215
public TableMetadata getImportTableMetadata(
210216
String namespace, String table, Map<String, DataType> overrideColumnsType)

0 commit comments

Comments
 (0)