Skip to content

Commit ef7cb13

Browse files
authored
fix: classify STATEMENT as a non-reserved identifier keyword (#2706)
Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent 8f6b3f2 commit ef7cb13

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2561,6 +2561,7 @@ String NonReservedWord() :
25612561
| tk=<K_STARTING:"STARTING">
25622562
| tk=<K_STEP: "STEP">
25632563
| tk=<K_STORED: "STORED">
2564+
| tk=<K_STATEMENT:"STATEMENT">
25642565
| tk=<K_STORAGE: "STORAGE">
25652566
| tk=<K_STREAM: "STREAM">
25662567
| tk=<K_STRICT: "STRICT">
@@ -2692,7 +2693,6 @@ TOKEN: /* Reserved SQL Keywords and structural tokens */
26922693
| <K_IN:"IN">
26932694
| <K_INCLUDES:"INCLUDES"> /* Salesforce SOQL */
26942695
| <K_INNER:"INNER">
2695-
| <K_STATEMENT:"STATEMENT">
26962696
| <K_STRAIGHT:"STRAIGHT_JOIN">
26972697
| <K_INTERSECT:"INTERSECT">
26982698
| <K_INTERVAL:"INTERVAL">
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create;
11+
12+
import static org.junit.jupiter.api.Assertions.*;
13+
import net.sf.jsqlparser.JSQLParserException;
14+
import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
15+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
16+
import net.sf.jsqlparser.statement.Statement;
17+
import net.sf.jsqlparser.statement.create.table.CreateTable;
18+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
19+
import net.sf.jsqlparser.util.deparser.StatementDeParser;
20+
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.params.ParameterizedTest;
22+
import org.junit.jupiter.params.provider.EnumSource;
23+
24+
class StatementIdentifierTest {
25+
@ParameterizedTest
26+
@EnumSource(value = Dialect.class, names = {"POSTGRESQL", "MYSQL"})
27+
void statementIsAnUnquotedIdentifier(Dialect dialect) throws JSQLParserException {
28+
CreateTable table = (CreateTable) CCJSqlParserUtil.parse(
29+
"CREATE TABLE statement (statement INT)", p -> p.withDialect(dialect));
30+
assertEquals("statement", table.getTable().getName());
31+
assertEquals("statement", table.getColumnDefinitions().get(0).getColumnName());
32+
for (String sql : new String[] {"SELECT statement FROM statement",
33+
"ALTER TABLE statement ADD COLUMN statement INT"}) {
34+
Statement statement = CCJSqlParserUtil.parse(sql, p -> p.withDialect(dialect));
35+
StringBuilder buffer = new StringBuilder();
36+
statement.accept(new StatementDeParser(buffer), null);
37+
assertEquals(sql, buffer.toString());
38+
}
39+
}
40+
41+
@Test
42+
void triggerOrientationRemainsAKeyword() throws JSQLParserException {
43+
CreateTrigger trigger = (CreateTrigger) CCJSqlParserUtil.parse(
44+
"CREATE TRIGGER tr AFTER INSERT ON t FOR EACH STATEMENT EXECUTE FUNCTION f()",
45+
p -> p.withDialect(Dialect.POSTGRESQL));
46+
assertEquals(CreateTrigger.Orientation.STATEMENT, trigger.getOrientation());
47+
assertTrue(trigger.toString().contains("FOR EACH STATEMENT"));
48+
}
49+
}

0 commit comments

Comments
 (0)