Skip to content

Commit fc87a81

Browse files
committed
Added flag about default value in TableColumn
1 parent c91ad03 commit fc87a81

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
@@ -776,7 +776,12 @@ private static Result<TableDescription> mapDescribeTable(Result<YdbTable.Describ
776776

777777
for (int i = 0; i < desc.getColumnsCount(); i++) {
778778
YdbTable.ColumnMeta column = desc.getColumns(i);
779-
description.addNonnullColumn(column.getName(), ProtoType.fromPb(column.getType()), column.getFamily());
779+
description.addColumn(new TableColumn(
780+
column.getName(),
781+
ProtoType.fromPb(column.getType()),
782+
column.getFamily(),
783+
column.hasFromLiteral() || column.hasFromSequence()
784+
));
780785
}
781786
description.setPrimaryKeys(desc.getPrimaryKeyList());
782787
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)