IGNITE-21950 Sql. Cover SQL T351(Bracketed SQL comments (/*...*/ comments)) feature by tests (#3727)

diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/AbstractParserTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/AbstractParserTest.java
index 8966b1e..670fd62 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/AbstractParserTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/AbstractParserTest.java
@@ -36,7 +36,7 @@
      * @param stmt Statement to parse.
      * @return An AST.
      */
-    protected SqlNode parse(String stmt) {
+    protected static SqlNode parse(String stmt) {
         StatementParseResult parseResult = IgniteSqlParser.parse(stmt, StatementParseResult.MODE);
         SqlNode statement = parseResult.statement();
 
@@ -53,7 +53,7 @@
      * @param pred Addition check that would be applied to the object.
      * @return {@code true} in case the object if instance of the given class and matches the predicat.
      */
-    protected <T> Matcher<T> ofTypeMatching(String desc, Class<T> cls, Predicate<T> pred) {
+    static <T> Matcher<T> ofTypeMatching(String desc, Class<T> cls, Predicate<T> pred) {
         return new CustomMatcher<>(desc) {
             /** {@inheritDoc} */
             @Override
@@ -67,7 +67,7 @@
      * Compares the result of calling {@link SqlNode#unparse(SqlWriter, int, int)}} on the given node with the expected string.
      * Also compares the expected string on a cloned node.
      */
-    protected static void expectUnparsed(SqlNode node, String expectedStmt) {
+    static void expectUnparsed(SqlNode node, String expectedStmt) {
         assertEquals(expectedStmt, unparse(node), "Unparsed does not match");
 
         // Verify that clone works correctly.
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/CommentParsingTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/CommentParsingTest.java
index 4714b77..bc19dad 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/CommentParsingTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/CommentParsingTest.java
@@ -36,6 +36,7 @@
  *
  * <p>Covers:<ol>
  * <li>E161: SQL comments using leading double minus</li>
+ * <li>T351: Bracketed SQL comments (&#47;*...*&#47; comments)</li>
  * </ol>
  *
  * <p>According to SQL standard, SQL text containing one or more instances of comment is equivalent to the same SQL text with the comment
@@ -47,11 +48,29 @@
 
     private static final String NL = System.lineSeparator();
 
+    private static final String SIMPLE_COMMENT = "-- this is simple comment ";
+    private static final String MULTILINE_COMMENT = "/* this" + NL
+            + "is" + NL
+            + "multiline" + NL
+            + "comment */";
+
     @ParameterizedTest
     @EnumSource(Statement.class)
     void leadingSimpleComment(Statement statement) {
         String originalQueryString = statement.text;
-        String queryWithComment = "-- this is comment " + NL + originalQueryString;
+        String queryWithComment = SIMPLE_COMMENT + NL + originalQueryString;
+
+        assertQueries(
+                originalQueryString,
+                queryWithComment
+        );
+    }
+
+    @ParameterizedTest
+    @EnumSource(Statement.class)
+    void leadingMultilineComment(Statement statement) {
+        String originalQueryString = statement.text;
+        String queryWithComment = MULTILINE_COMMENT + NL + originalQueryString;
 
         assertQueries(
                 originalQueryString,
@@ -63,7 +82,19 @@
     @EnumSource(Statement.class)
     void trailingSimpleComment(Statement statement) {
         String originalQueryString = statement.text;
-        String queryWithComment = originalQueryString + NL + "-- this is comment";
+        String queryWithComment = originalQueryString + NL + SIMPLE_COMMENT;
+
+        assertQueries(
+                originalQueryString,
+                queryWithComment
+        );
+    }
+
+    @ParameterizedTest
+    @EnumSource(Statement.class)
+    void trailingMultilineComment(Statement statement) {
+        String originalQueryString = statement.text;
+        String queryWithComment = originalQueryString + NL + MULTILINE_COMMENT;
 
         assertQueries(
                 originalQueryString,
@@ -76,7 +107,16 @@
         assertThrowsSqlException(
                 Sql.STMT_PARSE_ERR,
                 "Failed to parse query",
-                () -> parse("-- this is comment")
+                () -> parse(SIMPLE_COMMENT)
+        );
+    }
+
+    @Test
+    void emptyStatementMultilineComment() {
+        assertThrowsSqlException(
+                Sql.STMT_PARSE_ERR,
+                "Failed to parse query",
+                () -> parse(MULTILINE_COMMENT)
         );
     }
 
@@ -107,7 +147,7 @@
                 sb.app(line);
 
                 if (lineNum++ == lineToInject) {
-                    sb.app(" -- this is simple comment");
+                    sb.app(SIMPLE_COMMENT);
                 }
 
                 sb.app(NL);
@@ -117,7 +157,44 @@
         }
     }
 
-    private void assertQueries(String expected, String actual) {
+    /**
+     * This test injects simple comment before random line break.
+     */
+    @ParameterizedTest
+    @EnumSource(Statement.class)
+    void infixMultilineComment(Statement statement) {
+        int iterations = 50;
+        long seed = ThreadLocalRandom.current().nextLong();
+
+        LOG.info("Seed is {}", seed);
+
+        Random rnd = new Random(seed);
+
+        // it's well-known query that has less than
+        // Integer.MAX_VALUE lines
+        @SuppressWarnings("NumericCastThatLosesPrecision")
+        int linesCount = (int) statement.text.lines().count();
+
+        for (int i = 0; i < iterations; i++) {
+            int lineToInject = Integer.min(statement.maxLineBreak, rnd.nextInt(linesCount));
+
+            int lineNum = 0;
+            IgniteStringBuilder sb = new IgniteStringBuilder();
+            for (String line : statement.text.split(NL)) {
+                sb.app(line);
+
+                if (lineNum++ == lineToInject) {
+                    sb.app(MULTILINE_COMMENT);
+                }
+
+                sb.app(NL);
+            }
+
+            assertQueries(statement.text, sb.toString());
+        }
+    }
+
+    private static void assertQueries(String expected, String actual) {
         SqlNode expectedAst;
         SqlNode actualAst;
         try {