Skip to content

Commit bf10964

Browse files
committed
more tests and cases
1 parent baf5cb2 commit bf10964

File tree

8 files changed

+128
-43
lines changed

8 files changed

+128
-43
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -875,7 +875,7 @@ recordConstructorForInlineTable
875875
;
876876

877877
recordConstructor
878-
: ofTypeClause? '(' (uid DOT STAR | STAR | expressionWithName /* this can be removed */ | expressionWithOptionalName (',' expressionWithOptionalName)*) ')'
878+
: ofTypeClause? '(' (uid DOT STAR | STAR | expressionWithOptionalName (',' expressionWithOptionalName)*) ')'
879879
;
880880

881881
ofTypeClause

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
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;
4041

4142
import javax.annotation.Nonnull;
4243
import java.net.URI;
@@ -64,7 +65,7 @@ public Type getResultSetMetadata() {
6465
public RelationalResultSet executeAction(Transaction txn) throws RelationalException {
6566
final Schema schema = catalog.loadSchema(txn, dbId, schemaId);
6667

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

7071
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/RecordLayerTable.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,10 @@ private static KeyExpression toKeyExpression(@Nonnull final List<String> fields)
315315
@Nonnull
316316
private static KeyExpression toKeyExpression(@Nonnull final List<String> fields, int i) {
317317
Assert.thatUnchecked(0 <= i && i < fields.size());
318-
final var protobufCompliantName = DataTypeUtils.toProtoBufCompliantName(fields.get(i));
319318
if (i == fields.size() - 1) {
320-
return Key.Expressions.field(protobufCompliantName);
319+
return Key.Expressions.field(fields.get(i));
321320
}
322-
return Key.Expressions.field(protobufCompliantName).nest(toKeyExpression(fields, i + 1));
321+
return Key.Expressions.field(fields.get(i)).nest(toKeyExpression(fields, i + 1));
323322
}
324323

325324
private KeyExpression getPrimaryKey() {

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public static DdlVisitor of(@Nonnull BaseVisitor delegate,
100100
public DataType visitFunctionColumnType(@Nonnull final RelationalParser.FunctionColumnTypeContext ctx) {
101101
final var semanticAnalyzer = getDelegate().getSemanticAnalyzer();
102102
if (ctx.customType != null) {
103-
final var columnType = visitUid(ctx.customType);
103+
final var columnType = Identifier.toProtobufCompliant(visitUid(ctx.customType));
104104
return semanticAnalyzer.lookupType(columnType, true, false, metadataBuilder::findType);
105105
}
106106
return visitPrimitiveType(ctx.primitiveType()).withNullable(true);
@@ -164,6 +164,7 @@ public RecordLayerTable visitTableDefinition(@Nonnull RelationalParser.TableDefi
164164
if (ctx.primaryKeyDefinition().fullIdList() != null) {
165165
visitFullIdList(ctx.primaryKeyDefinition().fullIdList())
166166
.stream()
167+
.map(Identifier::toProtobufCompliant)
167168
.map(Identifier::fullyQualifiedName)
168169
.forEach(tableBuilder::addPrimaryKeyPart);
169170
}
@@ -325,7 +326,7 @@ private RecordLayerInvokedRoutine getInvokedRoutineMetadata(@Nonnull final Parse
325326
final var isTemporary = functionCtx instanceof RelationalParser.CreateTempFunctionContext;
326327

327328
// 1. get the function name.
328-
final var functionName = visitFullId(functionSpecCtx.schemaQualifiedRoutineName).toString();
329+
final var functionName = Identifier.toProtobufCompliant(visitFullId(functionSpecCtx.schemaQualifiedRoutineName)).toString();
329330

330331
// 2. get the function SQL definition string.
331332
final var queryString = getDelegate().getPlanGenerationContext().getQuery();
@@ -363,7 +364,7 @@ public ProceduralPlan visitCreateTempFunction(@Nonnull RelationalParser.CreateTe
363364

364365
@Override
365366
public ProceduralPlan visitDropTempFunction(@Nonnull RelationalParser.DropTempFunctionContext ctx) {
366-
final var functionName = visitFullId(ctx.schemaQualifiedRoutineName).toString();
367+
final var functionName = Identifier.toProtobufCompliant(visitFullId(ctx.schemaQualifiedRoutineName)).toString();
367368
var throwIfNotExists = ctx.IF() == null && ctx.EXISTS() == null;
368369
return ProceduralPlan.of(metadataOperationsFactory.getDropTemporaryFunctionConstantAction(throwIfNotExists, functionName));
369370
}
@@ -387,7 +388,7 @@ private CompiledSqlFunction visitSqlInvokedFunction(@Nonnull final RelationalPar
387388
@Nonnull final RelationalParser.RoutineBodyContext bodyCtx,
388389
boolean isTemporary) {
389390
// get the function name.
390-
final var functionName = visitFullId(functionSpecCtx.schemaQualifiedRoutineName).toString();
391+
final var functionName = Identifier.toProtobufCompliant(visitFullId(functionSpecCtx.schemaQualifiedRoutineName)).toString();
391392

392393
// run implementation-specific validations.
393394
final var props = functionSpecCtx.routineCharacteristics();
@@ -477,7 +478,7 @@ public Expressions visitSqlParameterDeclarations(final RelationalParser.SqlParam
477478
@Override
478479
public Expression visitSqlParameterDeclaration(@Nonnull RelationalParser.SqlParameterDeclarationContext ctx) {
479480
Assert.thatUnchecked(ctx.sqlParameterName != null, "unnamed parameters not supported");
480-
final var parameterName = visitUid(ctx.sqlParameterName);
481+
final var parameterName = Identifier.toProtobufCompliant(visitUid(ctx.sqlParameterName));
481482
final var parameterType = visitFunctionColumnType(ctx.parameterType);
482483
final var underlyingType = DataTypeUtils.toRecordLayerType(parameterType);
483484
Assert.thatUnchecked(parameterType.isResolved());

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public Expressions visitSelectElements(@Nonnull RelationalParser.SelectElementsC
171171
public Expression visitSelectExpressionElement(@Nonnull RelationalParser.SelectExpressionElementContext selectExpressionElementContext) {
172172
final var expression = Assert.castUnchecked(selectExpressionElementContext.expression().accept(this), Expression.class);
173173
if (selectExpressionElementContext.AS() != null) {
174-
final var expressionName = visitUid(selectExpressionElementContext.uid());
174+
final var expressionName = Identifier.toProtobufCompliant(visitUid(selectExpressionElementContext.uid()));
175175
return expression.withName(expressionName);
176176
}
177177
return expression;
@@ -253,7 +253,7 @@ public Expression visitGroupByItem(@Nonnull RelationalParser.GroupByItemContext
253253
Assert.isNullUnchecked(groupByItemContext.order, ErrorCode.UNSUPPORTED_QUERY, "ordering grouping column is not supported");
254254
final var expression = Assert.castUnchecked(groupByItemContext.expression().accept(this), Expression.class);
255255
if (groupByItemContext.uid() != null) {
256-
final var name = visitUid(groupByItemContext.uid());
256+
final var name = Identifier.toProtobufCompliant(visitUid(groupByItemContext.uid()));
257257
return expression.withName(name).asEphemeral();
258258
}
259259
return expression;
@@ -629,7 +629,7 @@ public Expression visitMathExpressionAtom(@Nonnull RelationalParser.MathExpressi
629629
@Override
630630
public Expression visitExpressionWithName(@Nonnull RelationalParser.ExpressionWithNameContext ctx) {
631631
final var expression = Assert.castUnchecked(ctx.expression().accept(this), Expression.class);
632-
final var name = visitUid(ctx.uid());
632+
final var name = Identifier.toProtobufCompliant(visitUid(ctx.uid()));
633633
return expression.withName(name);
634634
}
635635

@@ -638,7 +638,7 @@ public Expression visitExpressionWithName(@Nonnull RelationalParser.ExpressionWi
638638
public Expression visitExpressionWithOptionalName(@Nonnull RelationalParser.ExpressionWithOptionalNameContext ctx) {
639639
final var expression = Assert.castUnchecked(ctx.expression().accept(this), Expression.class);
640640
if (ctx.AS() != null) {
641-
final var name = visitUid(ctx.uid());
641+
final var name = Identifier.toProtobufCompliant(visitUid(ctx.uid()));
642642
return expression.withName(name);
643643
}
644644
return expression;
@@ -790,7 +790,7 @@ public Expression visitRecordConstructorForInlineTable(@Nonnull RelationalParser
790790
@Override
791791
public Expression visitRecordConstructor(@Nonnull RelationalParser.RecordConstructorContext ctx) {
792792
if (ctx.uid() != null) {
793-
final var id = visitUid(ctx.uid());
793+
final var id = Identifier.toProtobufCompliant(visitUid(ctx.uid()));
794794
if (ctx.STAR() == null) {
795795
final var expression = getDelegate().getSemanticAnalyzer().resolveIdentifier(id, getDelegate().getCurrentPlanFragment());
796796
final var resultValue = RecordConstructorValue.ofUnnamed(List.of(expression.getUnderlying()));
@@ -806,11 +806,9 @@ public Expression visitRecordConstructor(@Nonnull RelationalParser.RecordConstru
806806
final var resultValue = star.getUnderlying();
807807
return Expression.ofUnnamed(resultValue);
808808
}
809-
final var expressions = (ctx.expressionWithName() != null) ?
810-
parseRecordFieldsUnderReorderings(ImmutableList.of(ctx.expressionWithName())) :
811-
parseRecordFieldsUnderReorderings(ctx.expressionWithOptionalName());
809+
final var expressions = parseRecordFieldsUnderReorderings(ctx.expressionWithOptionalName());
812810
if (ctx.ofTypeClause() != null) {
813-
final var recordId = visitUid(ctx.ofTypeClause().uid());
811+
final var recordId = Identifier.toProtobufCompliant(visitUid(ctx.ofTypeClause().uid()));
814812
final var resultValue = RecordConstructorValue.ofColumnsAndName(expressions.underlyingAsColumns(), recordId.getName());
815813
return Expression.ofUnnamed(resultValue);
816814
}
@@ -845,7 +843,7 @@ public Expression visitArrayConstructor(@Nonnull RelationalParser.ArrayConstruct
845843
}
846844

847845
@Nonnull
848-
private Expressions parseRecordFields(@Nonnull List<? extends ParserRuleContext> parserRuleContexts,
846+
private Expressions parseRecordFields(@Nonnull List<RelationalParser.ExpressionWithOptionalNameContext> parserRuleContexts,
849847
@Nullable List<Type.Record.Field> targetFields) {
850848
Assert.thatUnchecked(targetFields == null || targetFields.size() == parserRuleContexts.size());
851849
final var resultsBuilder = ImmutableList.<Expression>builder();
@@ -858,7 +856,7 @@ private Expressions parseRecordFields(@Nonnull List<? extends ParserRuleContext>
858856
}
859857

860858
@Nonnull
861-
private Expression parseRecordField(@Nonnull ParserRuleContext parserRuleContext,
859+
private Expression parseRecordField(@Nonnull RelationalParser.ExpressionWithOptionalNameContext parserRuleContext,
862860
@Nullable Type.Record.Field targetField) {
863861
final var fieldType = targetField == null ? null : targetField.getFieldType();
864862
StringTrieNode reorderings = null;
@@ -879,7 +877,7 @@ private Expression parseRecordField(@Nonnull ParserRuleContext parserRuleContext
879877
newStateBuilder.withTargetTypeReorderings(targetFieldReorderings);
880878
}
881879
getDelegate().getCurrentPlanFragment().setState(newStateBuilder.build());
882-
expression = Assert.castUnchecked(parserRuleContext.accept(this), Expression.class);
880+
expression = Assert.castUnchecked(visitExpressionWithOptionalName(parserRuleContext), Expression.class);
883881
} finally {
884882
getDelegate().getCurrentPlanFragment().setStateMaybe(maybeState);
885883
}
@@ -926,7 +924,7 @@ private static Value coerceValueIfNecessary(@Nonnull Value value, @Nonnull Type
926924
}
927925

928926
@Nonnull
929-
private Expressions parseRecordFieldsUnderReorderings(@Nonnull final List<? extends ParserRuleContext> providedColumnContexts) {
927+
private Expressions parseRecordFieldsUnderReorderings(@Nonnull final List<RelationalParser.ExpressionWithOptionalNameContext> providedColumnContexts) {
930928
final var maybeState = getStateMaybe();
931929
if (maybeState.isEmpty() || maybeState.get().getTargetType().isEmpty()) {
932930
return parseRecordFields(providedColumnContexts, null);

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@
2121
package com.apple.foundationdb.relational.recordlayer.query.visitors;
2222

2323
import com.apple.foundationdb.annotation.API;
24-
2524
import com.apple.foundationdb.relational.api.exceptions.ErrorCode;
2625
import com.apple.foundationdb.relational.generated.RelationalParser;
2726
import com.apple.foundationdb.relational.recordlayer.query.Identifier;
2827
import com.apple.foundationdb.relational.util.Assert;
2928
import com.apple.foundationdb.relational.util.ExcludeFromJacocoGeneratedReport;
30-
3129
import com.google.common.collect.ImmutableList;
3230

3331
import javax.annotation.Nonnull;
@@ -120,6 +118,6 @@ public Identifier visitCollationName(@Nonnull RelationalParser.CollationNameCont
120118

121119
@Override
122120
public Identifier visitTableFunctionName(final RelationalParser.TableFunctionNameContext ctx) {
123-
return visitFullId(ctx.fullId());
121+
return Identifier.toProtobufCompliant(visitFullId(ctx.fullId()));
124122
}
125123
}

0 commit comments

Comments
 (0)