diff --git a/presto-main/src/main/java/io/prestosql/SystemSessionProperties.java b/presto-main/src/main/java/io/prestosql/SystemSessionProperties.java index 9095f04997e73..c23051466b61e 100644 --- a/presto-main/src/main/java/io/prestosql/SystemSessionProperties.java +++ b/presto-main/src/main/java/io/prestosql/SystemSessionProperties.java @@ -95,7 +95,6 @@ public final class SystemSessionProperties public static final String SPILL_WINDOW_OPERATOR = "spill_window_operator"; public static final String AGGREGATION_OPERATOR_UNSPILL_MEMORY_LIMIT = "aggregation_operator_unspill_memory_limit"; public static final String OPTIMIZE_DISTINCT_AGGREGATIONS = "optimize_mixed_distinct_aggregations"; - public static final String LEGACY_ROW_FIELD_ORDINAL_ACCESS = "legacy_row_field_ordinal_access"; public static final String ITERATIVE_OPTIMIZER = "iterative_optimizer_enabled"; public static final String ITERATIVE_OPTIMIZER_TIMEOUT = "iterative_optimizer_timeout"; public static final String ENABLE_FORCED_EXCHANGE_BELOW_GROUP_ID = "enable_forced_exchange_below_group_id"; @@ -429,11 +428,6 @@ public SystemSessionProperties( "Optimize mixed non-distinct and distinct aggregations", featuresConfig.isOptimizeMixedDistinctAggregations(), false), - booleanProperty( - LEGACY_ROW_FIELD_ORDINAL_ACCESS, - "Allow accessing anonymous row field with .field0, .field1, ...", - featuresConfig.isLegacyRowFieldOrdinalAccess(), - false), booleanProperty( ITERATIVE_OPTIMIZER, "Experimental: enable iterative optimizer", @@ -795,11 +789,6 @@ public static boolean isOptimizeDistinctAggregationEnabled(Session session) return session.getSystemProperty(OPTIMIZE_DISTINCT_AGGREGATIONS, Boolean.class); } - public static boolean isLegacyRowFieldOrdinalAccessEnabled(Session session) - { - return session.getSystemProperty(LEGACY_ROW_FIELD_ORDINAL_ACCESS, Boolean.class); - } - public static boolean isNewOptimizerEnabled(Session session) { return session.getSystemProperty(ITERATIVE_OPTIMIZER, Boolean.class); diff --git a/presto-main/src/main/java/io/prestosql/sql/analyzer/ExpressionAnalyzer.java b/presto-main/src/main/java/io/prestosql/sql/analyzer/ExpressionAnalyzer.java index dabb2e2876e5a..1e04eb9700d32 100644 --- a/presto-main/src/main/java/io/prestosql/sql/analyzer/ExpressionAnalyzer.java +++ b/presto-main/src/main/java/io/prestosql/sql/analyzer/ExpressionAnalyzer.java @@ -111,7 +111,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.OptionalInt; import java.util.Set; import java.util.function.Function; @@ -119,7 +118,6 @@ import static com.google.common.base.Verify.verify; import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.Iterables.getOnlyElement; -import static io.prestosql.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; import static io.prestosql.spi.function.OperatorType.SUBSCRIPT; import static io.prestosql.spi.type.BigintType.BIGINT; import static io.prestosql.spi.type.BooleanType.BOOLEAN; @@ -157,7 +155,6 @@ import static io.prestosql.util.DateTimeUtils.parseTimestampLiteral; import static io.prestosql.util.DateTimeUtils.timeHasTimeZone; import static io.prestosql.util.DateTimeUtils.timestampHasTimeZone; -import static io.prestosql.util.LegacyRowFieldOrdinalAccessUtil.parseAnonymousRowFieldOrdinalAccess; import static java.lang.String.format; import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableSet; @@ -173,7 +170,6 @@ public class ExpressionAnalyzer private final Function statementAnalyzerFactory; private final TypeProvider symbolTypes; private final boolean isDescribe; - private final boolean legacyRowFieldOrdinalAccess; private final Map, Signature> resolvedFunctions = new LinkedHashMap<>(); private final Set> scalarSubqueries = new LinkedHashSet<>(); @@ -210,7 +206,6 @@ public ExpressionAnalyzer( this.symbolTypes = requireNonNull(symbolTypes, "symbolTypes is null"); this.parameters = requireNonNull(parameters, "parameters is null"); this.isDescribe = isDescribe; - this.legacyRowFieldOrdinalAccess = isLegacyRowFieldOrdinalAccessEnabled(session); this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); } @@ -451,13 +446,6 @@ protected Type visitDereferenceExpression(DereferenceExpression node, StackableA } } - if (legacyRowFieldOrdinalAccess && rowFieldType == null) { - OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, rowType.getFields()); - if (rowIndex.isPresent()) { - rowFieldType = rowType.getFields().get(rowIndex.getAsInt()).getType(); - } - } - if (rowFieldType == null) { throw missingAttributeException(node); } diff --git a/presto-main/src/main/java/io/prestosql/sql/analyzer/FeaturesConfig.java b/presto-main/src/main/java/io/prestosql/sql/analyzer/FeaturesConfig.java index 37ec6926ed628..f84b19bd58cea 100644 --- a/presto-main/src/main/java/io/prestosql/sql/analyzer/FeaturesConfig.java +++ b/presto-main/src/main/java/io/prestosql/sql/analyzer/FeaturesConfig.java @@ -45,6 +45,7 @@ import static java.util.concurrent.TimeUnit.MINUTES; @DefunctConfig({ + "deprecated.legacy-row-field-ordinal-access", "deprecated.legacy-unnest-array-rows", "resource-group-manager", "experimental.resource-groups-enabled", @@ -85,7 +86,6 @@ public class FeaturesConfig private boolean groupByUsesEqualTo; private boolean legacyTimestamp = true; private boolean legacyMapSubscript; - private boolean legacyRowFieldOrdinalAccess; private boolean legacyCharToVarcharCoercion; private boolean optimizeMixedDistinctAggregations; private boolean forceSingleNodeOutput = true; @@ -198,18 +198,6 @@ public FeaturesConfig setDistributedIndexJoinsEnabled(boolean distributedIndexJo return this; } - @Config("deprecated.legacy-row-field-ordinal-access") - public FeaturesConfig setLegacyRowFieldOrdinalAccess(boolean value) - { - this.legacyRowFieldOrdinalAccess = value; - return this; - } - - public boolean isLegacyRowFieldOrdinalAccess() - { - return legacyRowFieldOrdinalAccess; - } - @Config("deprecated.legacy-char-to-varchar-coercion") public FeaturesConfig setLegacyCharToVarcharCoercion(boolean value) { diff --git a/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java b/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java index a3e27e155909e..99ca2f6255df6 100644 --- a/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java +++ b/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java @@ -107,7 +107,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.OptionalInt; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -119,7 +118,6 @@ import static com.google.common.base.Verify.verify; import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.Iterables.getOnlyElement; -import static io.prestosql.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; import static io.prestosql.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static io.prestosql.spi.StandardErrorCode.NOT_SUPPORTED; import static io.prestosql.spi.type.TypeSignature.parseTypeSignature; @@ -133,7 +131,6 @@ import static io.prestosql.sql.planner.iterative.rule.CanonicalizeExpressionRewriter.canonicalizeExpression; import static io.prestosql.type.LikeFunctions.isLikePattern; import static io.prestosql.type.LikeFunctions.unescapeLiteralLikePattern; -import static io.prestosql.util.LegacyRowFieldOrdinalAccessUtil.parseAnonymousRowFieldOrdinalAccess; import static java.lang.String.format; import static java.util.Objects.requireNonNull; @@ -146,7 +143,6 @@ public class ExpressionInterpreter private final boolean optimize; private final Map, Type> expressionTypes; private final InterpretedFunctionInvoker functionInvoker; - private final boolean legacyRowFieldOrdinalAccess; private final Visitor visitor; @@ -235,7 +231,6 @@ private ExpressionInterpreter(Expression expression, Metadata metadata, Session verify((expressionTypes.containsKey(NodeRef.of(expression)))); this.optimize = optimize; this.functionInvoker = new InterpretedFunctionInvoker(metadata.getFunctionRegistry()); - this.legacyRowFieldOrdinalAccess = isLegacyRowFieldOrdinalAccessEnabled(session); this.visitor = new Visitor(); } @@ -306,13 +301,6 @@ protected Object visitDereferenceExpression(DereferenceExpression node, Object c } } - if (legacyRowFieldOrdinalAccess && index < 0) { - OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, fields); - if (rowIndex.isPresent()) { - index = rowIndex.getAsInt(); - } - } - checkState(index >= 0, "could not find field name: %s", node.getField()); if (row.isNull(index)) { return null; diff --git a/presto-main/src/main/java/io/prestosql/sql/relational/SqlToRowExpressionTranslator.java b/presto-main/src/main/java/io/prestosql/sql/relational/SqlToRowExpressionTranslator.java index 7dc1d044c6ad4..a19b134fa1320 100644 --- a/presto-main/src/main/java/io/prestosql/sql/relational/SqlToRowExpressionTranslator.java +++ b/presto-main/src/main/java/io/prestosql/sql/relational/SqlToRowExpressionTranslator.java @@ -82,14 +82,12 @@ import java.util.List; import java.util.Map; -import java.util.OptionalInt; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; import static io.airlift.slice.SliceUtf8.countCodePoints; import static io.airlift.slice.Slices.utf8Slice; -import static io.prestosql.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; import static io.prestosql.metadata.FunctionKind.SCALAR; import static io.prestosql.spi.type.BigintType.BIGINT; import static io.prestosql.spi.type.BooleanType.BOOLEAN; @@ -131,7 +129,6 @@ import static io.prestosql.util.DateTimeUtils.parseTimeWithoutTimeZone; import static io.prestosql.util.DateTimeUtils.parseTimestampLiteral; import static io.prestosql.util.DateTimeUtils.parseYearMonthInterval; -import static io.prestosql.util.LegacyRowFieldOrdinalAccessUtil.parseAnonymousRowFieldOrdinalAccess; import static java.util.Objects.requireNonNull; public final class SqlToRowExpressionTranslator @@ -154,7 +151,6 @@ public static RowExpression translate( typeManager, layout, session.getTimeZoneKey(), - isLegacyRowFieldOrdinalAccessEnabled(session), SystemSessionProperties.isLegacyTimestamp(session)); RowExpression result = visitor.process(expression, null); @@ -176,7 +172,6 @@ private static class Visitor private final TypeManager typeManager; private final Map layout; private final TimeZoneKey timeZoneKey; - private final boolean legacyRowFieldOrdinalAccess; @Deprecated private final boolean isLegacyTimestamp; @@ -186,7 +181,6 @@ private Visitor( TypeManager typeManager, Map layout, TimeZoneKey timeZoneKey, - boolean legacyRowFieldOrdinalAccess, boolean isLegacyTimestamp) { this.functionKind = functionKind; @@ -194,7 +188,6 @@ private Visitor( this.typeManager = typeManager; this.layout = layout; this.timeZoneKey = timeZoneKey; - this.legacyRowFieldOrdinalAccess = legacyRowFieldOrdinalAccess; this.isLegacyTimestamp = isLegacyTimestamp; } @@ -604,13 +597,6 @@ protected RowExpression visitDereferenceExpression(DereferenceExpression node, V } } - if (legacyRowFieldOrdinalAccess && index < 0) { - OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, fields); - if (rowIndex.isPresent()) { - index = rowIndex.getAsInt(); - } - } - checkState(index >= 0, "could not find field name: %s", node.getField()); Type returnType = getType(node); return call(dereferenceSignature(returnType, rowType), returnType, process(node.getBase(), context), constant(index, INTEGER)); diff --git a/presto-main/src/main/java/io/prestosql/util/LegacyRowFieldOrdinalAccessUtil.java b/presto-main/src/main/java/io/prestosql/util/LegacyRowFieldOrdinalAccessUtil.java deleted file mode 100644 index 62933d816bb8e..0000000000000 --- a/presto-main/src/main/java/io/prestosql/util/LegacyRowFieldOrdinalAccessUtil.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.prestosql.util; - -import io.prestosql.spi.type.RowType; - -import java.util.List; -import java.util.OptionalInt; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class LegacyRowFieldOrdinalAccessUtil -{ - private static final Pattern ORDINAL_ROW_FIELD_NAME = Pattern.compile("(?i)field([0-9]+)"); - - private LegacyRowFieldOrdinalAccessUtil() {} - - public static OptionalInt parseAnonymousRowFieldOrdinalAccess(String fieldName, List rowFields) - { - Matcher matcher = ORDINAL_ROW_FIELD_NAME.matcher(fieldName); - if (!matcher.matches()) { - return OptionalInt.empty(); - } - int rowIndex; - try { - rowIndex = Integer.parseInt(matcher.group(1)); - } - catch (NumberFormatException e) { - return OptionalInt.empty(); - } - if (rowIndex >= rowFields.size()) { - return OptionalInt.empty(); - } - if (rowFields.get(rowIndex).getName().isPresent()) { - // not an anonymous field - return OptionalInt.empty(); - } - return OptionalInt.of(rowIndex); - } -} diff --git a/presto-main/src/test/java/io/prestosql/sql/analyzer/TestFeaturesConfig.java b/presto-main/src/test/java/io/prestosql/sql/analyzer/TestFeaturesConfig.java index 93b4939b72b62..0f734831c7814 100644 --- a/presto-main/src/test/java/io/prestosql/sql/analyzer/TestFeaturesConfig.java +++ b/presto-main/src/test/java/io/prestosql/sql/analyzer/TestFeaturesConfig.java @@ -91,7 +91,6 @@ public void testDefaults() .setEnableForcedExchangeBelowGroupId(true) .setExchangeCompressionEnabled(false) .setLegacyTimestamp(true) - .setLegacyRowFieldOrdinalAccess(false) .setLegacyCharToVarcharCoercion(false) .setEnableIntermediateAggregations(false) .setPushAggregationThroughJoin(true) @@ -125,7 +124,6 @@ public void testExplicitPropertyMappings() .put("enable-forced-exchange-below-group-id", "false") .put("deprecated.group-by-uses-equal", "true") .put("deprecated.legacy-map-subscript", "true") - .put("deprecated.legacy-row-field-ordinal-access", "true") .put("deprecated.legacy-char-to-varchar-coercion", "true") .put("distributed-index-joins-enabled", "true") .put("join-distribution-type", "BROADCAST") @@ -222,7 +220,6 @@ public void testExplicitPropertyMappings() .setMemoryRevokingTarget(0.8) .setExchangeCompressionEnabled(true) .setLegacyTimestamp(false) - .setLegacyRowFieldOrdinalAccess(true) .setLegacyCharToVarcharCoercion(true) .setEnableIntermediateAggregations(true) .setParseDecimalLiteralsAsDouble(true) diff --git a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java index de7f179ef4510..3cd252bef43fb 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java +++ b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java @@ -18,9 +18,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import io.airlift.slice.Slice; -import io.prestosql.Session; import io.prestosql.operator.scalar.AbstractTestFunctions; -import io.prestosql.operator.scalar.FunctionAssertions; import io.prestosql.spi.StandardErrorCode; import io.prestosql.spi.block.BlockBuilder; import io.prestosql.spi.function.LiteralParameters; @@ -30,9 +28,7 @@ import io.prestosql.spi.type.RowType; import io.prestosql.spi.type.StandardTypes; import io.prestosql.spi.type.Type; -import io.prestosql.sql.analyzer.FeaturesConfig; import io.prestosql.sql.analyzer.SemanticErrorCode; -import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -43,7 +39,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static io.prestosql.SessionTestUtils.TEST_SESSION; -import static io.prestosql.SystemSessionProperties.LEGACY_ROW_FIELD_ORDINAL_ACCESS; import static io.prestosql.spi.function.OperatorType.HASH_CODE; import static io.prestosql.spi.function.OperatorType.INDETERMINATE; import static io.prestosql.spi.type.BigintType.BIGINT; @@ -57,8 +52,6 @@ import static io.prestosql.spi.type.TypeSignature.parseTypeSignature; import static io.prestosql.spi.type.VarcharType.VARCHAR; import static io.prestosql.spi.type.VarcharType.createUnboundedVarcharType; -import static io.prestosql.spi.type.VarcharType.createVarcharType; -import static io.prestosql.sql.analyzer.SemanticErrorCode.MISSING_ATTRIBUTE; import static io.prestosql.testing.DateTimeTestingUtils.sqlTimestampOf; import static io.prestosql.type.JsonType.JSON; import static io.prestosql.util.StructuralTestUtil.appendToBlockBuilder; @@ -73,24 +66,10 @@ public class TestRowOperators { public TestRowOperators() {} - private static FunctionAssertions legacyRowFieldOrdinalAccess; - @BeforeClass public void setUp() { registerScalar(getClass()); - legacyRowFieldOrdinalAccess = new FunctionAssertions( - Session.builder(session) - .setSystemProperty(LEGACY_ROW_FIELD_ORDINAL_ACCESS, "true") - .build(), - new FeaturesConfig()); - } - - @AfterClass(alwaysRun = true) - public final void tearDown() - { - legacyRowFieldOrdinalAccess.close(); - legacyRowFieldOrdinalAccess = null; } @ScalarFunction @@ -408,21 +387,6 @@ public void testFieldAccessor() assertDecimalFunction("CAST(row(1.0, 123123123456.6549876543) AS ROW(col0 decimal(2,1), col1 decimal(22,10))).col0", decimal("1.0")); assertDecimalFunction("CAST(row(1.0, 123123123456.6549876543) AS ROW(col0 decimal(2,1), col1 decimal(22,10))).col1", decimal("123123123456.6549876543")); - - // Legacy anonymous row field ordinal access - legacyRowFieldOrdinalAccess.assertFunction("row(1, CAST(NULL AS DOUBLE)).field1", DOUBLE, null); - legacyRowFieldOrdinalAccess.assertFunction("row(TRUE, CAST(NULL AS BOOLEAN)).field1", BOOLEAN, null); - legacyRowFieldOrdinalAccess.assertFunction("row(TRUE, CAST(NULL AS ARRAY)).field1", new ArrayType(INTEGER), null); - legacyRowFieldOrdinalAccess.assertFunction("row(1.0E0, CAST(NULL AS VARCHAR)).field1", createUnboundedVarcharType(), null); - legacyRowFieldOrdinalAccess.assertFunction("row(1, 2).field0", INTEGER, 1); - legacyRowFieldOrdinalAccess.assertFunction("row(1, 'kittens').field1", createVarcharType(7), "kittens"); - legacyRowFieldOrdinalAccess.assertFunction("row(1, 2).\"field1\"", INTEGER, 2); - legacyRowFieldOrdinalAccess.assertFunction("array[row(1, 2)][1].field1", INTEGER, 2); - legacyRowFieldOrdinalAccess.assertFunction("row(FALSE, ARRAY [1, 2], MAP(ARRAY[1, 3], ARRAY[2.0E0, 4.0E0])).field1", new ArrayType(INTEGER), ImmutableList.of(1, 2)); - legacyRowFieldOrdinalAccess.assertFunction("row(FALSE, ARRAY [1, 2], MAP(ARRAY[1, 3], ARRAY[2.0E0, 4.0E0])).field2", mapType(INTEGER, DOUBLE), ImmutableMap.of(1, 2.0, 3, 4.0)); - legacyRowFieldOrdinalAccess.assertFunction("row(1.0E0, ARRAY[row(31, 4.1E0), row(32, 4.2E0)], row(3, 4.0E0)).field1[2].field0", INTEGER, 32); - legacyRowFieldOrdinalAccess.assertFunction("row(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).field10", INTEGER, 11); - legacyRowFieldOrdinalAccess.assertInvalidFunction("CAST(row(1, 2) as ROW(col0 integer, col1 integer)).field1", MISSING_ATTRIBUTE); } @Test