Skip to content

Commit c82ade3

Browse files
authored
Merge pull request #495 from alex268/support_default_values
Added flag about default value in TableColumn
2 parents ce99e84 + fc87a81 commit c82ade3

File tree

4 files changed

+144
-33
lines changed

4 files changed

+144
-33
lines changed

table/src/main/java/tech/ydb/table/description/TableColumn.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,17 @@ public class TableColumn {
1515
@Nullable
1616
private final String family;
1717

18-
public TableColumn(String name, Type type, String family) {
18+
private boolean hasDefaultValue;
19+
20+
public TableColumn(String name, Type type, String family, boolean hasDefaultValue) {
1921
this.name = name;
2022
this.type = type;
2123
this.family = family;
24+
this.hasDefaultValue = hasDefaultValue;
25+
}
26+
27+
public TableColumn(String name, Type type, String family) {
28+
this(name, type, family, false);
2229
}
2330

2431
public TableColumn(String name, Type type) {
@@ -33,6 +40,10 @@ public Type getType() {
3340
return type;
3441
}
3542

43+
public boolean hasDefaultValue() {
44+
return hasDefaultValue;
45+
}
46+
3647
@Nullable
3748
public String getFamily() {
3849
return family;

table/src/main/java/tech/ydb/table/description/TableDescription.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public List<ChangefeedDescription> getChangefeeds() {
117117
public static class Builder {
118118
private StoreType storeType = StoreType.ROW;
119119
private List<String> primaryKeys = Collections.emptyList();
120-
private final LinkedHashMap<String, TypeAndFamily> columns = new LinkedHashMap<>();
120+
private final Map<String, TableColumn> columns = new LinkedHashMap<>();
121121
private final List<TableIndex> indexes = new ArrayList<>();
122122
private final List<ColumnFamily> families = new ArrayList<>();
123123
private final List<KeyRange> keyRanges = new ArrayList<>();
@@ -133,12 +133,17 @@ public Builder setStoreType(StoreType storeType) {
133133
return this;
134134
}
135135

136+
public Builder addColumn(TableColumn column) {
137+
columns.put(column.getName(), column);
138+
return this;
139+
}
140+
136141
public Builder addNonnullColumn(String name, Type type) {
137142
return addNonnullColumn(name, type, null);
138143
}
139144

140145
public Builder addNonnullColumn(String name, Type type, String family) {
141-
columns.put(name, new TypeAndFamily(type, family));
146+
columns.put(name, new TableColumn(name, type, family));
142147
return this;
143148
}
144149

@@ -152,7 +157,7 @@ public Builder addNullableColumn(String name, Type type) {
152157
}
153158

154159
public Builder addNullableColumn(String name, Type type, String family) {
155-
columns.put(name, new TypeAndFamily(OptionalType.of(type), family));
160+
columns.put(name, new TableColumn(name, OptionalType.of(type), family));
156161
return this;
157162
}
158163

@@ -279,8 +284,8 @@ private List<TableColumn> buildColumns() {
279284

280285
int i = 0;
281286
TableColumn[] array = new TableColumn[this.columns.size()];
282-
for (Map.Entry<String, Builder.TypeAndFamily> e : this.columns.entrySet()) {
283-
array[i++] = new TableColumn(e.getKey(), e.getValue().type, e.getValue().family);
287+
for (Map.Entry<String, TableColumn> e : this.columns.entrySet()) {
288+
array[i++] = e.getValue();
284289
}
285290

286291
return ImmutableList.copyOf(array);
@@ -296,16 +301,6 @@ private void checkColumnKnown(String name) {
296301
throw new IllegalArgumentException("unknown column name: " + name);
297302
}
298303
}
299-
300-
private static class TypeAndFamily {
301-
private final Type type;
302-
private final String family;
303-
304-
TypeAndFamily(Type type, String family) {
305-
this.type = type;
306-
this.family = family;
307-
}
308-
}
309304
}
310305

311306
public static class PartitionStats {

table/src/main/java/tech/ydb/table/impl/BaseSession.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,12 @@ private static Result<TableDescription> mapDescribeTable(Result<YdbTable.Describ
792792

793793
for (int i = 0; i < desc.getColumnsCount(); i++) {
794794
YdbTable.ColumnMeta column = desc.getColumns(i);
795-
description.addNonnullColumn(column.getName(), ProtoType.fromPb(column.getType()), column.getFamily());
795+
description.addColumn(new TableColumn(
796+
column.getName(),
797+
ProtoType.fromPb(column.getType()),
798+
column.getFamily(),
799+
column.hasFromLiteral() || column.hasFromSequence()
800+
));
796801
}
797802
description.setPrimaryKeys(desc.getPrimaryKeyList());
798803
for (int i = 0; i < desc.getIndexesCount(); i++) {

table/src/test/java/tech/ydb/table/integration/AlterTableTest.java

Lines changed: 116 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ public void alterTableTest() {
7979
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
8080

8181
Assert.assertEquals(5, description.getColumns().size());
82-
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64);
83-
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text.makeOptional());
84-
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float.makeOptional());
85-
assertColumn(description.getColumns().get(3), "created", PrimitiveType.Timestamp.makeOptional());
86-
assertColumn(description.getColumns().get(4), "data", PrimitiveType.Text.makeOptional());
82+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64, true, false);
83+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text);
84+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
85+
assertColumn(description.getColumns().get(3), "created", PrimitiveType.Timestamp);
86+
assertColumn(description.getColumns().get(4), "data", PrimitiveType.Text);
8787

8888
Assert.assertEquals(2, description.getIndexes().size());
8989
assertIndexSync(description.getIndexes().get(0), "idx1", Arrays.asList("id", "code"), Collections.emptyList());
@@ -108,11 +108,11 @@ public void alterTableTest() {
108108
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
109109

110110
Assert.assertEquals(5, description.getColumns().size());
111-
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64);
112-
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text.makeOptional());
113-
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float.makeOptional());
114-
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text.makeOptional());
115-
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes.makeOptional());
111+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64, true, false);
112+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text);
113+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
114+
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text);
115+
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes);
116116

117117
Assert.assertEquals(2, description.getIndexes().size());
118118
assertIndexSync(description.getIndexes().get(0), "idx1", Arrays.asList("id", "code"), Collections.emptyList());
@@ -135,20 +135,120 @@ public void alterTableTest() {
135135
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
136136

137137
Assert.assertEquals(5, description.getColumns().size());
138-
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64);
139-
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text.makeOptional());
140-
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float.makeOptional());
141-
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text.makeOptional());
142-
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes.makeOptional());
138+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Uint64, true, false);
139+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text);
140+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
141+
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text);
142+
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes);
143+
144+
Assert.assertEquals(1, description.getIndexes().size());
145+
assertIndexAsync(description.getIndexes().get(0), "idx2", Arrays.asList("data"), Arrays.asList("code"));
146+
}
147+
148+
@Test
149+
public void alterTableWithSerialTest() {
150+
// --------------------- craete table -----------------------------
151+
Status createStatus = ctx.supplyStatus(session -> session.executeSchemeQuery(""
152+
+ "CREATE TABLE alter_table_test ("
153+
+ " id BigSerial NOT NULL,"
154+
+ " code Text NOT NULL,"
155+
+ " size Float,"
156+
+ " created Timestamp,"
157+
+ " data Text,"
158+
+ " PRIMARY KEY(id),"
159+
+ " INDEX idx1 GLOBAL ON (id, code),"
160+
+ " INDEX idx2 GLOBAL ASYNC ON (data) COVER (code)"
161+
+ ")"
162+
)).join();
163+
Assert.assertTrue("Create table with indexes " + createStatus, createStatus.isSuccess());
164+
165+
// --------------------- describe table after creating -----------------------------
166+
Result<TableDescription> describeResult = ctx.supplyResult(session ->session.describeTable(tablePath)).join();
167+
Assert.assertTrue("Describe table with indexes " + describeResult.getStatus(), describeResult.isSuccess());
168+
169+
TableDescription description = describeResult.getValue();
170+
171+
Assert.assertEquals(TableDescription.StoreType.ROW, description.getStoreType());
172+
Assert.assertEquals(1, description.getColumnFamilies().size());
173+
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
174+
175+
Assert.assertEquals(5, description.getColumns().size());
176+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Int64, true, true);
177+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text, true, false);
178+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
179+
assertColumn(description.getColumns().get(3), "created", PrimitiveType.Timestamp);
180+
assertColumn(description.getColumns().get(4), "data", PrimitiveType.Text);
181+
182+
Assert.assertEquals(2, description.getIndexes().size());
183+
assertIndexSync(description.getIndexes().get(0), "idx1", Arrays.asList("id", "code"), Collections.emptyList());
184+
assertIndexAsync(description.getIndexes().get(1), "idx2", Arrays.asList("data"), Arrays.asList("code"));
185+
186+
// --------------------- alter table with changing columns -----------------------------
187+
188+
Status alterStatus = ctx.supplyStatus(
189+
session -> session.alterTable(tablePath, new AlterTableSettings()
190+
.addNullableColumn("data2", PrimitiveType.Bytes)
191+
.dropColumn("created"))
192+
).join();
193+
Assert.assertTrue("Alter table with column " + alterStatus, alterStatus.isSuccess());
194+
195+
// --------------------- describe table after first altering -----------------------------
196+
describeResult = ctx.supplyResult(session ->session.describeTable(tablePath)).join();
197+
Assert.assertTrue("Describe table after altering " + describeResult.getStatus(), describeResult.isSuccess());
198+
199+
description = describeResult.getValue();
200+
201+
Assert.assertEquals(1, description.getColumnFamilies().size());
202+
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
203+
204+
Assert.assertEquals(5, description.getColumns().size());
205+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Int64, true, true);
206+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text, true, false);
207+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
208+
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text);
209+
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes);
210+
211+
Assert.assertEquals(2, description.getIndexes().size());
212+
assertIndexSync(description.getIndexes().get(0), "idx1", Arrays.asList("id", "code"), Collections.emptyList());
213+
assertIndexAsync(description.getIndexes().get(1), "idx2", Arrays.asList("data"), Arrays.asList("code"));
214+
215+
// --------------------- alter table with changing indexes -----------------------------
216+
alterStatus = ctx.supplyStatus(
217+
session -> session.alterTable(tablePath, new AlterTableSettings()
218+
.dropIndex("idx1"))
219+
).join();
220+
Assert.assertTrue("Alter table with indexes " + alterStatus, alterStatus.isSuccess());
221+
222+
// --------------------- describe table after first altering -----------------------------
223+
describeResult = ctx.supplyResult(session ->session.describeTable(tablePath)).join();
224+
Assert.assertTrue("Describe table after altering " + describeResult.getStatus(), describeResult.isSuccess());
225+
226+
description = describeResult.getValue();
227+
228+
Assert.assertEquals(1, description.getColumnFamilies().size());
229+
Assert.assertEquals(DEFAULT_FAMILY, description.getColumnFamilies().get(0).getName());
230+
231+
Assert.assertEquals(5, description.getColumns().size());
232+
assertColumn(description.getColumns().get(0), "id", PrimitiveType.Int64, true, true);
233+
assertColumn(description.getColumns().get(1), "code", PrimitiveType.Text, true, false);
234+
assertColumn(description.getColumns().get(2), "size", PrimitiveType.Float);
235+
assertColumn(description.getColumns().get(3), "data", PrimitiveType.Text);
236+
assertColumn(description.getColumns().get(4), "data2", PrimitiveType.Bytes);
143237

144238
Assert.assertEquals(1, description.getIndexes().size());
145239
assertIndexAsync(description.getIndexes().get(0), "idx2", Arrays.asList("data"), Arrays.asList("code"));
146240
}
147241

148242
private void assertColumn(TableColumn column, String name, Type type) {
243+
assertColumn(column, name, type, false, false);
244+
}
245+
246+
private void assertColumn(TableColumn column, String name, Type type, boolean isNotNull, boolean hasDefaultValue) {
149247
Assert.assertEquals(name, column.getName());
150-
Assert.assertEquals(type, column.getType());
248+
Assert.assertEquals(isNotNull ? type : type.makeOptional(), column.getType());
151249
Assert.assertEquals(EMPTY_FAMILY, column.getFamily());
250+
// Assert.assertEquals(isNotNull, column.isNotNull());
251+
Assert.assertEquals(hasDefaultValue, column.hasDefaultValue());
152252
}
153253

154254
private void assertIndexSync(TableIndex index, String name, List<String> columns, List<String> dataColumns) {

0 commit comments

Comments
 (0)