Skip to content

Commit de792f0

Browse files
committed
Revert "Protobuf compliant translation for supporting richer identifiers for tables and columns (FoundationDB#3696)"
This reverts commit 9a18447.
1 parent cca36b5 commit de792f0

File tree

15 files changed

+82
-380
lines changed

15 files changed

+82
-380
lines changed

fdb-relational-core/src/main/antlr/RelationalParser.g4

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,7 @@ recordConstructorForInlineTable
879879
;
880880

881881
recordConstructor
882-
: ofTypeClause? '(' (uid DOT STAR | STAR | expressionWithOptionalName (',' expressionWithOptionalName)*) ')'
882+
: ofTypeClause? '(' (uid DOT STAR | STAR | expressionWithName /* this can be removed */ | expressionWithOptionalName (',' expressionWithOptionalName)*) ')'
883883
;
884884

885885
ofTypeClause
@@ -913,6 +913,10 @@ expressionOrDefault
913913
: expression | DEFAULT
914914
;
915915

916+
expressionWithName
917+
: expression AS uid
918+
;
919+
916920
expressionWithOptionalName
917921
: expression (AS uid)?
918922
;

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/ddl/RecordLayerCatalogQueryFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import com.apple.foundationdb.relational.api.metadata.SchemaTemplate;
3838
import com.apple.foundationdb.relational.recordlayer.ArrayRow;
3939
import com.apple.foundationdb.relational.recordlayer.IteratorResultSet;
40-
import com.apple.foundationdb.relational.recordlayer.metadata.DataTypeUtils;
4140

4241
import javax.annotation.Nonnull;
4342
import java.net.URI;
@@ -65,7 +64,7 @@ public Type getResultSetMetadata() {
6564
public RelationalResultSet executeAction(Transaction txn) throws RelationalException {
6665
final Schema schema = catalog.loadSchema(txn, dbId, schemaId);
6766

68-
final List<String> tableNames = schema.getTables().stream().map(Metadata::getName).map(DataTypeUtils::toUserIdentifier)
67+
final List<String> tableNames = schema.getTables().stream().map(Metadata::getName)
6968
.collect(Collectors.toList());
7069

7170
final List<String> indexNames = schema.getTables().stream().flatMap(t -> t.getIndexes().stream()).map(Metadata::getName)

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/metadata/DataTypeUtils.java

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
package com.apple.foundationdb.relational.recordlayer.metadata;
2222

2323
import com.apple.foundationdb.annotation.API;
24+
2425
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
2526
import com.apple.foundationdb.relational.api.exceptions.ErrorCode;
2627
import com.apple.foundationdb.relational.api.metadata.DataType;
2728
import com.apple.foundationdb.relational.util.Assert;
2829
import com.apple.foundationdb.relational.util.SpotBugsSuppressWarnings;
30+
2931
import com.google.common.collect.BiMap;
3032
import com.google.common.collect.HashBiMap;
3133

@@ -39,10 +41,6 @@
3941
@API(API.Status.EXPERIMENTAL)
4042
public class DataTypeUtils {
4143

42-
private static final String DOUBLE_UNDERSCORE_ESCAPE = "__0";
43-
private static final String DOLLAR_ESCAPE = "__1";
44-
private static final String DOT_ESCAPE = "__2";
45-
4644
@Nonnull
4745
private static final BiMap<DataType, Type> primitivesMap;
4846

@@ -57,20 +55,6 @@ public class DataTypeUtils {
5755
@SpotBugsSuppressWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "should never happen, there is failUnchecked directly before that.")
5856
@Nonnull
5957
public static DataType toRelationalType(@Nonnull final Type type) {
60-
return toRelationalType(type, false);
61-
}
62-
63-
/**
64-
* Converts a Record Layer {@link Type} into a Relational {@link DataType}.
65-
*
66-
* Note: This method is expensive, use with care, i.e. try to cache its result as much as possible.
67-
*
68-
* @param type The Relational data type.
69-
* @return The corresponding Record Layer type.
70-
*/
71-
@SpotBugsSuppressWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "should never happen, there is failUnchecked directly before that.")
72-
@Nonnull
73-
public static DataType toRelationalType(@Nonnull final Type type, boolean toUserIdentifier) {
7458
if (primitivesMap.containsValue(type)) {
7559
return primitivesMap.inverse().get(type);
7660
}
@@ -91,44 +75,32 @@ public static DataType toRelationalType(@Nonnull final Type type, boolean toUser
9175
switch (typeCode) {
9276
case RECORD:
9377
final var record = (Type.Record) type;
94-
final var columns = record.getFields().stream().map(field -> {
95-
final var fieldName = toUserIdentifier ? DataTypeUtils.toUserIdentifier(field.getFieldName()) : field.getFieldName();
96-
return DataType.StructType.Field.from(fieldName, toRelationalType(field.getFieldType(), toUserIdentifier), field.getFieldIndex());
97-
}).collect(Collectors.toList());
98-
final var name = record.getName() == null ? getUniqueName() : (toUserIdentifier ? DataTypeUtils.toUserIdentifier(record.getName()) : record.getName());
99-
return DataType.StructType.from(name, columns, record.isNullable());
78+
final var columns = record.getFields().stream().map(field -> DataType.StructType.Field.from(field.getFieldName(), toRelationalType(field.getFieldType()), field.getFieldIndex())).collect(Collectors.toList());
79+
return DataType.StructType.from(record.getName() == null ? toProtoBufCompliantName(UUID.randomUUID().toString()) : record.getName(), columns, record.isNullable());
10080
case ARRAY:
10181
final var asArray = (Type.Array) type;
10282
return DataType.ArrayType.from(toRelationalType(Assert.notNullUnchecked(asArray.getElementType())), asArray.isNullable());
10383
case ENUM:
10484
final var asEnum = (Type.Enum) type;
10585
final var enumValues = asEnum.getEnumValues().stream().map(v -> DataType.EnumType.EnumValue.of(v.getName(), v.getNumber())).collect(Collectors.toList());
106-
return DataType.EnumType.from(asEnum.getName() == null ? getUniqueName() : asEnum.getName(), enumValues, asEnum.isNullable());
86+
return DataType.EnumType.from(asEnum.getName() == null ? toProtoBufCompliantName(UUID.randomUUID().toString()) : asEnum.getName(), enumValues, asEnum.isNullable());
10787
default:
10888
Assert.failUnchecked(String.format(Locale.ROOT, "unexpected type %s", type));
10989
return null; // make compiler happy.
11090
}
11191
}
11292

11393
@Nonnull
114-
private static String getUniqueName() {
115-
final var uuid = UUID.randomUUID().toString();
116-
final var modified = uuid.replace("-", "_");
117-
final char c = uuid.charAt(0);
94+
private static String toProtoBufCompliantName(@Nonnull final String input) {
95+
Assert.thatUnchecked(input.length() > 0);
96+
final var modified = input.replace("-", "_");
97+
final char c = input.charAt(0);
11898
if (c == '_' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
11999
return modified;
120100
}
121101
return "id" + modified;
122102
}
123103

124-
public static String toProtoBufCompliantName(String userIdentifier) {
125-
return userIdentifier.replace("__", DOUBLE_UNDERSCORE_ESCAPE).replace("$", DOLLAR_ESCAPE).replace(".", DOT_ESCAPE);
126-
}
127-
128-
public static String toUserIdentifier(String protoIdentifier) {
129-
return protoIdentifier.replace(DOT_ESCAPE, ".").replace(DOLLAR_ESCAPE, "$").replace(DOUBLE_UNDERSCORE_ESCAPE, "__");
130-
}
131-
132104
/**
133105
* Converts a given Relational {@link DataType} into a corresponding Record Layer {@link Type}.
134106
*

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/Identifier.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@
2222

2323
import com.apple.foundationdb.annotation.API;
2424

25-
import com.apple.foundationdb.relational.recordlayer.metadata.DataTypeUtils;
2625
import com.google.common.collect.ImmutableList;
2726

2827
import javax.annotation.Nonnull;
2928
import java.util.Collection;
3029
import java.util.List;
3130
import java.util.Objects;
3231
import java.util.function.Function;
33-
import java.util.stream.Collectors;
3432

3533
@API(API.Status.EXPERIMENTAL)
3634
public class Identifier {
@@ -144,13 +142,6 @@ public boolean qualifiedWith(@Nonnull Identifier identifier) {
144142
return true;
145143
}
146144

147-
@Nonnull
148-
public static Identifier toProtobufCompliant(@Nonnull final Identifier identifier) {
149-
final var qualifier = identifier.getQualifier().stream().map(DataTypeUtils::toProtoBufCompliantName).collect(Collectors.toList());
150-
final var name = DataTypeUtils.toProtoBufCompliantName(identifier.getName());
151-
return Identifier.of(name, qualifier);
152-
}
153-
154145
@Override
155146
public boolean equals(Object obj) {
156147
if (obj == this) {

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/PseudoColumn.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,4 @@ public static Optional<Expression> mapToExpressionMaybe(@Nonnull LogicalOperator
7373
}
7474
return Optional.empty();
7575
}
76-
77-
public static boolean isPseudoColumn(@Nonnull String name) {
78-
for (PseudoColumn pseudo : PseudoColumn.values()) {
79-
if (name.equals(pseudo.getColumnName())) {
80-
return true;
81-
}
82-
}
83-
return false;
84-
}
8576
}

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ private RelationalResultSet executePhysicalPlan(@Nonnull final RecordLayerSchema
404404
parsedContinuation.getExecutionState(),
405405
executeProperties));
406406
final var currentPlanHashMode = OptionsUtils.getCurrentPlanHashMode(options);
407-
final var dataType = (DataType.StructType) DataTypeUtils.toRelationalType(type, true);
407+
final var dataType = (DataType.StructType) DataTypeUtils.toRelationalType(type);
408408
return executionContext.metricCollector.clock(RelationalMetric.RelationalEvent.CREATE_RESULT_SET_ITERATOR, () -> {
409409
final ResumableIterator<Row> iterator = RecordLayerIterator.create(cursor, messageFDBQueriedRecord -> new MessageTuple(messageFDBQueriedRecord.getMessage()));
410410
return new RecordLayerResultSet(RelationalStructMetaData.of(dataType), iterator, connection,

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/BaseVisitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,12 @@ public Object visitExpressionOrDefault(@Nonnull RelationalParser.ExpressionOrDef
13371337
return visitChildren(ctx);
13381338
}
13391339

1340+
@Nonnull
1341+
@Override
1342+
public Expression visitExpressionWithName(@Nonnull RelationalParser.ExpressionWithNameContext ctx) {
1343+
return expressionVisitor.visitExpressionWithName(ctx);
1344+
}
1345+
13401346
@Nonnull
13411347
@Override
13421348
public Expression visitExpressionWithOptionalName(@Nonnull RelationalParser.ExpressionWithOptionalNameContext ctx) {

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/DdlVisitor.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public DataType visitFunctionColumnType(@Nonnull final RelationalParser.Function
107107
final var semanticAnalyzer = getDelegate().getSemanticAnalyzer();
108108
final SemanticAnalyzer.ParsedTypeInfo typeInfo;
109109
if (ctx.customType != null) {
110-
final var columnType = Identifier.toProtobufCompliant(visitUid(ctx.customType));
110+
final var columnType = visitUid(ctx.customType);
111111
typeInfo = SemanticAnalyzer.ParsedTypeInfo.ofCustomType(columnType, true, false);
112112
} else {
113113
typeInfo = SemanticAnalyzer.ParsedTypeInfo.ofPrimitiveType(ctx.primitiveType(), true, false);
@@ -141,7 +141,7 @@ public DataType visitColumnType(@Nonnull RelationalParser.ColumnTypeContext ctx)
141141
@Nonnull
142142
@Override
143143
public RecordLayerColumn visitColumnDefinition(@Nonnull RelationalParser.ColumnDefinitionContext ctx) {
144-
final var columnId = Identifier.toProtobufCompliant(visitUid(ctx.colName));
144+
final var columnId = visitUid(ctx.colName);
145145
final var isRepeated = ctx.ARRAY() != null;
146146
final var isNullable = ctx.columnConstraint() != null ? (Boolean) ctx.columnConstraint().accept(this) : true;
147147
// TODO: We currently do not support NOT NULL for any type other than ARRAY. This is because there is no way to
@@ -153,7 +153,7 @@ public RecordLayerColumn visitColumnDefinition(@Nonnull RelationalParser.ColumnD
153153
final var semanticAnalyzer = getDelegate().getSemanticAnalyzer();
154154
final SemanticAnalyzer.ParsedTypeInfo typeInfo;
155155
if (ctx.columnType().customType != null) {
156-
final var columnType = Identifier.toProtobufCompliant(visitUid(ctx.columnType().customType));
156+
final var columnType = visitUid(ctx.columnType().customType);
157157
typeInfo = SemanticAnalyzer.ParsedTypeInfo.ofCustomType(columnType, isNullable, isRepeated);
158158
} else {
159159
typeInfo = SemanticAnalyzer.ParsedTypeInfo.ofPrimitiveType(ctx.columnType().primitiveType(), isNullable, isRepeated);
@@ -165,15 +165,14 @@ public RecordLayerColumn visitColumnDefinition(@Nonnull RelationalParser.ColumnD
165165
@Nonnull
166166
@Override
167167
public RecordLayerTable visitTableDefinition(@Nonnull RelationalParser.TableDefinitionContext ctx) {
168-
final var tableId = Identifier.toProtobufCompliant(visitUid(ctx.uid()));
168+
final var tableId = visitUid(ctx.uid());
169169
final var columns = ctx.columnDefinition().stream().map(this::visitColumnDefinition).collect(ImmutableList.toImmutableList());
170170
final var tableBuilder = RecordLayerTable.newBuilder(metadataBuilder.isIntermingleTables())
171171
.setName(tableId.getName())
172172
.addColumns(columns);
173173
if (ctx.primaryKeyDefinition().fullIdList() != null) {
174174
visitFullIdList(ctx.primaryKeyDefinition().fullIdList())
175175
.stream()
176-
.map(Identifier::toProtobufCompliant)
177176
.map(Identifier::fullyQualifiedName)
178177
.forEach(tableBuilder::addPrimaryKeyPart);
179178
}
@@ -183,7 +182,7 @@ public RecordLayerTable visitTableDefinition(@Nonnull RelationalParser.TableDefi
183182
@Nonnull
184183
@Override
185184
public RecordLayerTable visitStructDefinition(@Nonnull RelationalParser.StructDefinitionContext ctx) {
186-
final var structId = Identifier.toProtobufCompliant(visitUid(ctx.uid()));
185+
final var structId = visitUid(ctx.uid());
187186
final var columns = ctx.columnDefinition().stream().map(this::visitColumnDefinition).collect(ImmutableList.toImmutableList());
188187
final var structBuilder = RecordLayerTable.newBuilder(metadataBuilder.isIntermingleTables())
189188
.setName(structId.getName())
@@ -341,7 +340,7 @@ private RecordLayerInvokedRoutine getInvokedRoutineMetadata(@Nonnull final Parse
341340
final var isTemporary = functionCtx instanceof RelationalParser.CreateTempFunctionContext;
342341

343342
// 1. get the function name.
344-
final var functionName = Identifier.toProtobufCompliant(visitFullId(functionSpecCtx.schemaQualifiedRoutineName)).toString();
343+
final var functionName = visitFullId(functionSpecCtx.schemaQualifiedRoutineName).toString();
345344

346345
// 2. get the function SQL definition string.
347346
final var queryString = getDelegate().getPlanGenerationContext().getQuery();
@@ -413,7 +412,7 @@ public ProceduralPlan visitCreateTempFunction(@Nonnull RelationalParser.CreateTe
413412

414413
@Override
415414
public ProceduralPlan visitDropTempFunction(@Nonnull RelationalParser.DropTempFunctionContext ctx) {
416-
final var functionName = Identifier.toProtobufCompliant(visitFullId(ctx.schemaQualifiedRoutineName)).toString();
415+
final var functionName = visitFullId(ctx.schemaQualifiedRoutineName).toString();
417416
var throwIfNotExists = ctx.IF() == null && ctx.EXISTS() == null;
418417
return ProceduralPlan.of(metadataOperationsFactory.getDropTemporaryFunctionConstantAction(throwIfNotExists, functionName));
419418
}
@@ -432,7 +431,7 @@ private UserDefinedFunction visitSqlInvokedFunction(@Nonnull final RelationalPar
432431
@Nonnull final RelationalParser.RoutineBodyContext bodyCtx,
433432
boolean isTemporary) {
434433
// get the function name.
435-
final var functionName = Identifier.toProtobufCompliant(visitFullId(functionSpecCtx.schemaQualifiedRoutineName)).toString();
434+
final var functionName = visitFullId(functionSpecCtx.schemaQualifiedRoutineName).toString();
436435

437436
// run implementation-specific validations.
438437
final var props = functionSpecCtx.routineCharacteristics();
@@ -540,7 +539,7 @@ public Expressions visitSqlParameterDeclarations(final RelationalParser.SqlParam
540539
@Override
541540
public Expression visitSqlParameterDeclaration(@Nonnull RelationalParser.SqlParameterDeclarationContext ctx) {
542541
Assert.thatUnchecked(ctx.sqlParameterName != null, "unnamed parameters not supported");
543-
final var parameterName = Identifier.toProtobufCompliant(visitUid(ctx.sqlParameterName));
542+
final var parameterName = visitUid(ctx.sqlParameterName);
544543
final var parameterType = visitFunctionColumnType(ctx.parameterType);
545544
final var underlyingType = DataTypeUtils.toRecordLayerType(parameterType);
546545
Assert.thatUnchecked(parameterType.isResolved());

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/DelegatingVisitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,12 @@ public Object visitExpressionOrDefault(@Nonnull RelationalParser.ExpressionOrDef
12021202
return getDelegate().visitExpressionOrDefault(ctx);
12031203
}
12041204

1205+
@Nonnull
1206+
@Override
1207+
public Expression visitExpressionWithName(@Nonnull RelationalParser.ExpressionWithNameContext ctx) {
1208+
return getDelegate().visitExpressionWithName(ctx);
1209+
}
1210+
12051211
@Nonnull
12061212
@Override
12071213
public Expression visitExpressionWithOptionalName(@Nonnull RelationalParser.ExpressionWithOptionalNameContext ctx) {

0 commit comments

Comments
 (0)