tkalkirill commented on code in PR #13464:
URL: https://github.com/apache/ignite/pull/13464#discussion_r3765790454


##########
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:
   It refers to the unconditional SQL-node rewrite performed by 
`IgniteSqlCallRewriteTable`: the `NVL(?, 10000)` call is rewritten to an 
equivalent `CASE` expression during validation. The test verifies that a 
dynamic parameter inside `FETCH` is still typed and converted correctly after 
this rewrite.



-- 
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]

Reply via email to