NestedCommentTest.java
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.select;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class NestedCommentTest {
private void assertParses(String sql) {
assertDoesNotThrow(() -> CCJSqlParserUtil.parse(sql),
"Failed to parse: " + sql);
}
@Test
void testFlatBlockComment() {
assertParses("SELECT /* simple comment */ 1");
}
@Test
void testNestedBlockComment() {
assertParses("SELECT /* outer /* inner */ outer */ 1");
}
@Test
void testDeeplyNestedBlockComment() {
assertParses(
"SELECT /* level 0 /* level 1 /* level 2 */ back to 1 */ back to 0 */ 1");
}
@Test
void testNestedCommentInWhereClause() {
assertParses(
"SELECT * FROM t WHERE /* a /* nested */ comment */ x = 1");
}
@Test
void testNestedCommentContainingStars() {
assertParses("SELECT /* ** /* * */ ** */ 1");
}
@Test
void testNestedCommentContainingSlashes() {
assertParses("SELECT /* // /* -- */ // */ 1");
}
@Test
void testMultipleNestedCommentsInSequence() {
assertParses("SELECT /* /* a */ */ 1, /* /* b */ */ 2");
}
@Test
@Disabled
void testNestedCommentWithSQL() {
// Common use case: commenting out code that already contains comments
assertParses(
"SELECT * FROM t WHERE 1 = 1\n"
+ "/* commented out:\n"
+ " AND x = /* default */ 42\n"
+ " AND y = 0\n"
+ "*/");
}
@Test
void testEmptyNestedComment() {
assertParses("SELECT /* /**/ */ 1");
}
@Test
void testLineCommentStillWorks() {
assertParses("SELECT 1 -- line comment");
}
@Test
void testLineCommentInsideBlockComment() {
assertParses("SELECT /* -- not a line comment */ 1");
}
@Test
void testMultilineNestedComment() {
assertParses(
"SELECT *\n"
+ "/*\n"
+ " /*\n"
+ " nested across lines\n"
+ " */\n"
+ "*/\n"
+ "FROM t");
}
@Test
void testOracleHintPreserved() {
assertParses("SELECT /*+ FULL(t) */ * FROM t");
}
}