zstan commented on code in PR #13464:
URL: https://github.com/apache/ignite/pull/13464#discussion_r3764869596
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java:
##########
@@ -199,6 +197,128 @@ public void testOffsetOutOfRange() throws Exception {
assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1
OFFSET 10)").returns(NULL_RESULT).check();
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + ") ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + " + 1) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + " +
bigValue() + ") ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (-2)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 -
4) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (-1.5)
ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST ('abc')
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(SUBSTRING('abc', 1, 1)) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(CAST(NULL AS INTEGER)) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (id)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (id + 1)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ABS(id)) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (SUM(1))
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ROW_NUMBER() OVER ()) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ABS((SELECT 1))) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST SQRT(4)
ROWS ONLY", null);
+ }
+
+ /** */
+ @Test
+ public void testFetchExpression() throws Exception {
+ fillCache(cacheRepl, 5);
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1) ROWS
ONLY")
+ .returns(0)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 5 -
2) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .returns(3)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2
- 1) + 1) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1
+ (2 - 1) + 1) ROWS ONLY")
+ .returns(4)
+ .returns(3)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST
(ABS(-2)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 +
ABS(-2)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (SQRT(4)
+ 1 + 0) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST
(EXTRACT(YEAR FROM CURRENT_DATE)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .returns(3)
+ .returns(4)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionNested() throws Exception {
+ fillCache(cacheRepl, 5);
+
+ assertQuery("SELECT id FROM (SELECT id from TEST_REPL ORDER BY id
FETCH FIRST (2 + 3) ROWS ONLY) " +
+ "ORDER BY id FETCH NEXT (1 + 1) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionWithRewrite() throws Exception {
+ fillCache(cacheRepl, 5);
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 +
NVL(?, 10000)) ROWS ONLY")
+ .withParams(1)
+ .returns(0)
+ .returns(1)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionWithoutPushDown() throws Exception {
Review Comment:
Why it called "WithoutPushDown" ? i didn\`t see any push down here, if it
relates to appropriate planner test - it can be changed after some time...
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java:
##########
@@ -283,4 +403,9 @@ private String createSql(int lim, int off, boolean param,
boolean sorted) {
return sb.toString();
}
+
+ /** */
+ private static BigDecimal bigValue() {
Review Comment:
```suggestion
private static BigDecimal moreThanMaxLong() {
```
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java:
##########
@@ -61,6 +66,51 @@ public void testLimit() throws Exception {
.and(hasChildThat(isInstanceOf(IgniteSort.class)))));
}
+ /** */
+ @Test
+ public void testFetchExpressionPushDown() throws Exception {
+ IgniteSchema publicSchema =
createSchemaWithTable(IgniteDistributions.random());
+
+ assertPlan("SELECT * FROM TEST ORDER BY ID FETCH FIRST (ABS(-2)) ROWS
ONLY", publicSchema,
+ isInstanceOf(IgniteLimit.class)
+ .and(input(isInstanceOf(IgniteExchange.class)
+ .and(input(isInstanceOf(IgniteSort.class)
+ .and(sort -> sort.fetch != null))))));
+
+ assertPlan("SELECT * FROM TEST ORDER BY ID OFFSET 1 ROWS "
+ + "FETCH FIRST (ABS(0.5)) ROWS ONLY", publicSchema,
+ isInstanceOf(IgniteLimit.class)
+ .and(limit -> limit.offset() != null && limit.fetch() != null)
+ .and(input(isInstanceOf(IgniteExchange.class)
+ .and(input(isInstanceOf(IgniteSort.class)
+ .and(sort -> sort.offset == null && sort.fetch ==
null))))));
+
+ assertPlan("SELECT * FROM TEST ORDER BY ID OFFSET 1 ROWS "
+ + "FETCH FIRST (RAND_INTEGER(1) + 2) ROWS ONLY", publicSchema,
Review Comment:
plz explain why '(RAND_INTEGER(1) + 2)' is not push down into IgniteSort,
white '(ABS(100))' pushes ?
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java:
##########
@@ -199,6 +197,128 @@ public void testOffsetOutOfRange() throws Exception {
assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1
OFFSET 10)").returns(NULL_RESULT).check();
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + ") ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + " + 1) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + " +
bigValue() + ") ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (-2)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 -
4) ROWS ONLY", null);
Review Comment:
redundant previous test will be enough
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java:
##########
@@ -216,6 +216,139 @@ public void testFractionalLimitOffset() {
assertThrowsSqlException("SELECT id FROM person ORDER BY id OFFSET ?
ROWS", null, BigDecimal.valueOf(-1.5));
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
+ createAndPopulateTable();
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, -2);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, -1.5);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, NULL_RESULT);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, bigValue());
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, "abc");
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (1 + ? - 4)
ROWS ONLY", null, 1);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (? - (50 -
20)) ROWS ONLY", null, 2);
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST SQRT(?)
ROWS ONLY", null, 4);
+ }
+
+ /** */
+ @Test
+ public void testFetchExpression() {
+ createAndPopulateTable();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (?) ROWS
ONLY")
+ .withParams(1)
+ .returns(0)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (1 + ? - 2)
ROWS ONLY")
+ .withParams(5)
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .returns(3)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (1 + (? -
1) + 1) ROWS ONLY")
+ .withParams(2)
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id DESC FETCH FIRST (1 +
(2 - 1) + ?) ROWS ONLY")
+ .withParams(2)
+ .returns(4)
+ .returns(3)
+ .returns(2)
+ .returns(1)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (ABS(?))
ROWS ONLY")
+ .withParams(-2)
+ .returns(0)
+ .returns(1)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (1 +
ABS(?)) ROWS ONLY")
+ .withParams(-2)
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (SQRT(?) +
1 + 0) ROWS ONLY")
+ .withParams(4)
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionCachedQuery() {
+ createAndPopulateTable();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (? + 1)
ROWS ONLY")
+ .withParams(1)
+ .returns(0)
+ .returns(1)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id FETCH FIRST (? + 1)
ROWS ONLY")
+ .withParams(2)
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id DESC FETCH FIRST (? +
1) ROWS ONLY")
+ .withParams(1)
+ .returns(4)
+ .returns(3)
+ .check();
+
+ assertQuery("SELECT id FROM PERSON ORDER BY id DESC FETCH FIRST (? +
1) ROWS ONLY")
+ .withParams(2)
+ .returns(4)
+ .returns(3)
+ .returns(2)
+ .check();
+
+ // Check negative param.
+ assertThrowsSqlException("SELECT id FROM PERSON ORDER BY id FETCH
FIRST (? + 1) ROWS ONLY", null, -2);
+ assertThrowsSqlException("SELECT id FROM PERSON ORDER BY id DESC FETCH
FIRST (? + 1) ROWS ONLY", null, -2);
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionNested() {
+ createAndPopulateTable();
+
+ assertQuery("SELECT id FROM (SELECT id from PERSON ORDER BY id FETCH
FIRST (? + 3) ROWS ONLY) " +
+ "ORDER BY id FETCH NEXT (1 + ?) ROWS ONLY")
+ .withParams(2, 1)
+ .returns(0)
+ .returns(1)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionWithRewrite() {
Review Comment:
what 'rewrite' is means here ?
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java:
##########
@@ -216,6 +216,139 @@ public void testFractionalLimitOffset() {
assertThrowsSqlException("SELECT id FROM person ORDER BY id OFFSET ?
ROWS", null, BigDecimal.valueOf(-1.5));
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
+ createAndPopulateTable();
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, -2);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, -1.5);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, NULL_RESULT);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, bigValue());
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (?) ROWS
ONLY", null, "abc");
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (1 + ? - 4)
ROWS ONLY", null, 1);
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST (? - (50 -
20)) ROWS ONLY", null, 2);
+
+ assertThrowsSqlException("SELECT * FROM PERSON FETCH FIRST SQRT(?)
ROWS ONLY", null, 4);
+ }
+
+ /** */
+ @Test
+ public void testFetchExpression() {
Review Comment:
I think all such kind of tests need to be implemented in scope of :
test_limit.test
Integrations test need to contain only rare\concreete\hard script-tests
implemented cases
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java:
##########
@@ -199,6 +197,128 @@ public void testOffsetOutOfRange() throws Exception {
assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1
OFFSET 10)").returns(NULL_RESULT).check();
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
Review Comment:
test cases are throws different exceptions, why you don\`t want to fix them ?
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java:
##########
@@ -391,4 +524,9 @@ public void testWrongParametersNumberInUpdate() {
private void assertUnexpectedNumberOfParameters(String qry, Object...
params) {
assertThrows(qry, IgniteSQLException.class, "Wrong number of query
parameters", params);
}
+
+ /** */
+ private static BigDecimal bigValue() {
Review Comment:
```suggestion
private static BigDecimal moreThanMaxLong() {
```
##########
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelFieldTrimmer.java:
##########
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.ignite.internal.processors.query.calcite.prepare;
+
+import java.util.Set;
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelFieldCollation;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Sort;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexDynamicParam;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.sql.validate.SqlValidator;
+import org.apache.calcite.sql2rel.RelFieldTrimmer;
+import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.mapping.Mapping;
+import org.apache.calcite.util.mapping.Mappings;
+import org.jetbrains.annotations.Nullable;
+
+import static java.util.Collections.emptySet;
+
+/** Field trimmer that preserves expression-based FETCH nodes. */
+// TODO: https://issues.apache.org/jira/browse/CALCITE-7592
+// Remove this class and IgniteSqlToRelConvertor.newFieldTrimmer() after
upgrading to Calcite 1.43.
+public class IgniteRelFieldTrimmer extends RelFieldTrimmer {
Review Comment:
May it\'s better to fix it in IgnitePlanner ? with appropriate TODO:
CALCITE-7592 remove after ... mention ?
```
public RelRoot trimUnusedFields(RelRoot root) {
final SqlToRelConverter.Config cfg = sqlToRelConverterCfg
.withExpand(false)
.withTrimUnusedFields(true);
SqlToRelConverter converter = sqlToRelConverter(validator(),
catalogReader, cfg);
boolean ordered = !root.collation.getFieldCollations().isEmpty();
boolean dml = SqlKind.DML.contains(root.kind);
if (root.rel instanceof Sort) {
if (!supportedByRelBuilder(((Sort)root.rel).fetch))
return root;
}
return root.withRel(converter.trimUnusedFields(dml || ordered,
root.rel));
}
```
##########
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java:
##########
@@ -199,6 +197,128 @@ public void testOffsetOutOfRange() throws Exception {
assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1
OFFSET 10)").returns(NULL_RESULT).check();
}
+ /** */
+ @Test
+ public void testInvalidFetchExpression() {
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + ") ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (" +
bigValue() + " + 1) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + " +
bigValue() + ") ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (-2)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 -
4) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (-1.5)
ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST ('abc')
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(SUBSTRING('abc', 1, 1)) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(CAST(NULL AS INTEGER)) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (id)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (id + 1)
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ABS(id)) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST (SUM(1))
ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ROW_NUMBER() OVER ()) ROWS ONLY", null);
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST
(ABS((SELECT 1))) ROWS ONLY", null);
+
+ assertThrowsSqlException("SELECT * FROM TEST_REPL FETCH FIRST SQRT(4)
ROWS ONLY", null);
+ }
+
+ /** */
+ @Test
+ public void testFetchExpression() throws Exception {
+ fillCache(cacheRepl, 5);
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1) ROWS
ONLY")
+ .returns(0)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 5 -
2) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .returns(3)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2
- 1) + 1) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1
+ (2 - 1) + 1) ROWS ONLY")
+ .returns(4)
+ .returns(3)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST
(ABS(-2)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 +
ABS(-2)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (SQRT(4)
+ 1 + 0) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .check();
+
+ assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST
(EXTRACT(YEAR FROM CURRENT_DATE)) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .returns(2)
+ .returns(3)
+ .returns(4)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionNested() throws Exception {
+ fillCache(cacheRepl, 5);
+
+ assertQuery("SELECT id FROM (SELECT id from TEST_REPL ORDER BY id
FETCH FIRST (2 + 3) ROWS ONLY) " +
+ "ORDER BY id FETCH NEXT (1 + 1) ROWS ONLY")
+ .returns(0)
+ .returns(1)
+ .check();
+ }
+
+ /** */
+ @Test
+ public void testFetchExpressionWithRewrite() throws Exception {
Review Comment:
need to belongs to DynamicParametersIntegrationTest
##########
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java:
##########
@@ -343,7 +343,14 @@ private static boolean isAsCall(SqlNode node) {
/** {@inheritDoc} */
@Override public RelRoot rel(SqlNode sql) {
- SqlToRelConverter sqlToRelConverter = sqlToRelConverter(validator(),
catalogReader, sqlToRelConverterCfg);
+ // TODO: https://issues.apache.org/jira/browse/CALCITE-7592
+ // Restore the original implementation after upgrading to Calcite
1.43: use validator() directly and remove
+ // deriveLimitDynamicParameterTypes().
+ IgniteSqlValidator validator = (IgniteSqlValidator)validator();
Review Comment:
misunderstand this change, plz highlight what test will fail without this
change ?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]