Skip to content

Commit e3afa5f

Browse files
fix: Postgres NextVal() function
- allow `NEXTVAL` token for function names - fixes #1863 - add test case
1 parent 7bd42ed commit e3afa5f

File tree

4 files changed

+133
-79
lines changed

4 files changed

+133
-79
lines changed

src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java

Lines changed: 122 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -45,78 +45,130 @@ public class ParserKeywordsUtils {
4545

4646
// Classification follows http://www.h2database.com/html/advanced.html#keywords
4747
public final static Object[][] ALL_RESERVED_KEYWORDS = {
48-
{"ABSENT", RESTRICTED_JSQLPARSER}, {"ALL", RESTRICTED_SQL2016},
49-
{"AND", RESTRICTED_SQL2016}, {"ANY", RESTRICTED_JSQLPARSER}, {"AS", RESTRICTED_SQL2016},
50-
{"BETWEEN", RESTRICTED_SQL2016}, {"BOTH", RESTRICTED_SQL2016},
51-
{"CASEWHEN", RESTRICTED_ALIAS}, {"CHECK", RESTRICTED_SQL2016},
52-
{"CONNECT", RESTRICTED_ALIAS}, {"CONNECT_BY_ROOT", RESTRICTED_JSQLPARSER},
53-
{"CONSTRAINT", RESTRICTED_SQL2016}, {"CREATE", RESTRICTED_ALIAS},
54-
{"CROSS", RESTRICTED_SQL2016}, {"CURRENT", RESTRICTED_JSQLPARSER},
55-
{"DISTINCT", RESTRICTED_SQL2016}, {"DOUBLE", RESTRICTED_ALIAS},
56-
{"ELSE", RESTRICTED_JSQLPARSER}, {"EXCEPT", RESTRICTED_SQL2016},
57-
{"EXISTS", RESTRICTED_SQL2016}, {"FETCH", RESTRICTED_SQL2016},
58-
{"FINAL", RESTRICTED_JSQLPARSER}, {"FOR", RESTRICTED_SQL2016},
59-
{"FORCE", RESTRICTED_SQL2016}, {"FOREIGN", RESTRICTED_SQL2016},
60-
{"FROM", RESTRICTED_SQL2016}, {"FULL", RESTRICTED_SQL2016},
61-
{"GROUP", RESTRICTED_SQL2016}, {"GROUPING", RESTRICTED_ALIAS},
48+
{"ABSENT", RESTRICTED_JSQLPARSER},
49+
{"ALL", RESTRICTED_SQL2016},
50+
{"AND", RESTRICTED_SQL2016},
51+
{"ANY", RESTRICTED_JSQLPARSER},
52+
{"AS", RESTRICTED_SQL2016},
53+
{"BETWEEN", RESTRICTED_SQL2016},
54+
{"BOTH", RESTRICTED_SQL2016},
55+
{"CASEWHEN", RESTRICTED_ALIAS},
56+
{"CHECK", RESTRICTED_SQL2016},
57+
{"CONNECT", RESTRICTED_ALIAS},
58+
{"CONNECT_BY_ROOT", RESTRICTED_JSQLPARSER},
59+
{"CONSTRAINT", RESTRICTED_SQL2016},
60+
{"CREATE", RESTRICTED_ALIAS},
61+
{"CROSS", RESTRICTED_SQL2016},
62+
{"CURRENT", RESTRICTED_JSQLPARSER},
63+
{"DISTINCT", RESTRICTED_SQL2016},
64+
{"DOUBLE", RESTRICTED_ALIAS},
65+
{"ELSE", RESTRICTED_JSQLPARSER},
66+
{"EXCEPT", RESTRICTED_SQL2016},
67+
{"EXISTS", RESTRICTED_SQL2016},
68+
{"FETCH", RESTRICTED_SQL2016},
69+
{"FINAL", RESTRICTED_JSQLPARSER},
70+
{"FOR", RESTRICTED_SQL2016},
71+
{"FORCE", RESTRICTED_SQL2016},
72+
{"FOREIGN", RESTRICTED_SQL2016},
73+
{"FROM", RESTRICTED_SQL2016},
74+
{"FULL", RESTRICTED_SQL2016},
75+
{"GROUP", RESTRICTED_SQL2016},
76+
{"GROUPING", RESTRICTED_ALIAS},
6277
{"QUALIFY", RESTRICTED_ALIAS},
63-
{"HAVING", RESTRICTED_SQL2016}, {"IF", RESTRICTED_SQL2016}, {"IIF", RESTRICTED_ALIAS},
64-
{"IGNORE", RESTRICTED_ALIAS}, {"ILIKE", RESTRICTED_SQL2016}, {"IN", RESTRICTED_SQL2016},
65-
{"INNER", RESTRICTED_SQL2016}, {"INTERSECT", RESTRICTED_SQL2016},
66-
{"INTERVAL", RESTRICTED_SQL2016}, {"INTO", RESTRICTED_JSQLPARSER},
67-
{"IS", RESTRICTED_SQL2016}, {"JOIN", RESTRICTED_JSQLPARSER},
68-
{"LATERAL", RESTRICTED_SQL2016}, {"LEFT", RESTRICTED_SQL2016},
69-
{"LIKE", RESTRICTED_SQL2016}, {"LIMIT", RESTRICTED_SQL2016},
70-
{"MINUS", RESTRICTED_SQL2016}, {"NATURAL", RESTRICTED_SQL2016},
71-
{"NOCYCLE", RESTRICTED_JSQLPARSER}, {"NOT", RESTRICTED_SQL2016},
72-
{"NULL", RESTRICTED_SQL2016}, {"OFFSET", RESTRICTED_SQL2016},
73-
{"ON", RESTRICTED_SQL2016}, {"ONLY", RESTRICTED_JSQLPARSER},
74-
{"OPTIMIZE", RESTRICTED_ALIAS}, {"OR", RESTRICTED_SQL2016},
75-
{"ORDER", RESTRICTED_SQL2016}, {"OUTER", RESTRICTED_JSQLPARSER},
76-
{"OUTPUT", RESTRICTED_JSQLPARSER}, {"OPTIMIZE ", RESTRICTED_JSQLPARSER},
77-
{"PIVOT", RESTRICTED_JSQLPARSER}, {"PROCEDURE", RESTRICTED_ALIAS},
78-
{"PUBLIC", RESTRICTED_ALIAS}, {"RECURSIVE", RESTRICTED_SQL2016},
79-
{"REGEXP", RESTRICTED_SQL2016}, {"RETURNING", RESTRICTED_JSQLPARSER},
80-
{"RIGHT", RESTRICTED_SQL2016}, {"SAMPLE", RESTRICTED_ALIAS}, {"SEL", RESTRICTED_ALIAS},
78+
{"HAVING", RESTRICTED_SQL2016},
79+
{"IF", RESTRICTED_SQL2016},
80+
{"IIF", RESTRICTED_ALIAS},
81+
{"IGNORE", RESTRICTED_ALIAS},
82+
{"ILIKE", RESTRICTED_SQL2016},
83+
{"IN", RESTRICTED_SQL2016},
84+
{"INNER", RESTRICTED_SQL2016},
85+
{"INTERSECT", RESTRICTED_SQL2016},
86+
{"INTERVAL", RESTRICTED_SQL2016},
87+
{"INTO", RESTRICTED_JSQLPARSER},
88+
{"IS", RESTRICTED_SQL2016},
89+
{"JOIN", RESTRICTED_JSQLPARSER},
90+
{"LATERAL", RESTRICTED_SQL2016},
91+
{"LEFT", RESTRICTED_SQL2016},
92+
{"LIKE", RESTRICTED_SQL2016},
93+
{"LIMIT", RESTRICTED_SQL2016},
94+
{"MINUS", RESTRICTED_SQL2016},
95+
{"NATURAL", RESTRICTED_SQL2016},
96+
{"NOCYCLE", RESTRICTED_JSQLPARSER},
97+
{"NOT", RESTRICTED_SQL2016},
98+
{"NULL", RESTRICTED_SQL2016},
99+
{"OFFSET", RESTRICTED_SQL2016},
100+
{"ON", RESTRICTED_SQL2016},
101+
{"ONLY", RESTRICTED_JSQLPARSER},
102+
{"OPTIMIZE", RESTRICTED_ALIAS},
103+
{"OR", RESTRICTED_SQL2016},
104+
{"ORDER", RESTRICTED_SQL2016},
105+
{"OUTER", RESTRICTED_JSQLPARSER},
106+
{"OUTPUT", RESTRICTED_JSQLPARSER},
107+
{"OPTIMIZE ", RESTRICTED_JSQLPARSER},
108+
{"PIVOT", RESTRICTED_JSQLPARSER},
109+
{"PROCEDURE", RESTRICTED_ALIAS},
110+
{"PUBLIC", RESTRICTED_ALIAS},
111+
{"RECURSIVE", RESTRICTED_SQL2016},
112+
{"REGEXP", RESTRICTED_SQL2016},
113+
{"RETURNING", RESTRICTED_JSQLPARSER},
114+
{"RIGHT", RESTRICTED_SQL2016},
115+
{"SAMPLE", RESTRICTED_ALIAS},
116+
{"SEL", RESTRICTED_ALIAS},
81117
{"SELECT", RESTRICTED_ALIAS},
82-
{"SEMI", RESTRICTED_JSQLPARSER}, {"SET", RESTRICTED_JSQLPARSER},
83-
{"SOME", RESTRICTED_JSQLPARSER}, {"START", RESTRICTED_JSQLPARSER},
84-
{"TABLES", RESTRICTED_ALIAS}, {"TOP", RESTRICTED_SQL2016},
85-
{"TRAILING", RESTRICTED_SQL2016}, {"UNBOUNDED", RESTRICTED_JSQLPARSER},
86-
{"UNION", RESTRICTED_SQL2016}, {"UNIQUE", RESTRICTED_SQL2016},
87-
{"UNPIVOT", RESTRICTED_JSQLPARSER}, {"USE", RESTRICTED_JSQLPARSER},
88-
{"USING", RESTRICTED_SQL2016}, {"SQL_CACHE", RESTRICTED_JSQLPARSER},
89-
{"SQL_CALC_FOUND_ROWS", RESTRICTED_JSQLPARSER}, {"SQL_NO_CACHE", RESTRICTED_JSQLPARSER},
90-
{"STRAIGHT_JOIN", RESTRICTED_JSQLPARSER}, {"TABLESAMPLE", RESTRICTED_ALIAS},
118+
{"SEMI", RESTRICTED_JSQLPARSER},
119+
{"SET", RESTRICTED_JSQLPARSER},
120+
{"SOME", RESTRICTED_JSQLPARSER},
121+
{"START", RESTRICTED_JSQLPARSER},
122+
{"TABLES", RESTRICTED_ALIAS},
123+
{"TOP", RESTRICTED_SQL2016},
124+
{"TRAILING", RESTRICTED_SQL2016},
125+
{"UNBOUNDED", RESTRICTED_JSQLPARSER},
126+
{"UNION", RESTRICTED_SQL2016},
127+
{"UNIQUE", RESTRICTED_SQL2016},
128+
{"UNPIVOT", RESTRICTED_JSQLPARSER},
129+
{"USE", RESTRICTED_JSQLPARSER},
130+
{"USING", RESTRICTED_SQL2016},
131+
{"SQL_CACHE", RESTRICTED_JSQLPARSER},
132+
{"SQL_CALC_FOUND_ROWS", RESTRICTED_JSQLPARSER},
133+
{"SQL_NO_CACHE", RESTRICTED_JSQLPARSER},
134+
{"STRAIGHT_JOIN", RESTRICTED_JSQLPARSER},
135+
{"TABLESAMPLE", RESTRICTED_ALIAS},
91136
{"VALUE", RESTRICTED_JSQLPARSER},
92-
{"VALUES", RESTRICTED_SQL2016}, {"VARYING", RESTRICTED_JSQLPARSER},
93-
{"WHEN", RESTRICTED_SQL2016}, {"WHERE", RESTRICTED_SQL2016},
94-
{"WINDOW", RESTRICTED_SQL2016}, {"WITH", RESTRICTED_SQL2016},
95-
{"XOR", RESTRICTED_JSQLPARSER}, {"XMLSERIALIZE", RESTRICTED_JSQLPARSER}
137+
{"VALUES", RESTRICTED_SQL2016},
138+
{"VARYING", RESTRICTED_JSQLPARSER},
139+
{"WHEN", RESTRICTED_SQL2016},
140+
{"WHERE", RESTRICTED_SQL2016},
141+
{"WINDOW", RESTRICTED_SQL2016},
142+
{"WITH", RESTRICTED_SQL2016},
143+
{"XOR", RESTRICTED_JSQLPARSER},
144+
{"XMLSERIALIZE", RESTRICTED_JSQLPARSER},
96145

97146
// add keywords from the composite token definitions:
98147
// tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME>
99148
// we will use the composite tokens instead, which are always hit first before the
100149
// simple keywords
101150
// @todo: figure out a way to remove these composite tokens, as they do more harm than
102151
// good
103-
, {"SEL", RESTRICTED_JSQLPARSER}, {"SELECT", RESTRICTED_JSQLPARSER}
104-
105-
, {"DATE", RESTRICTED_JSQLPARSER}, {"TIME", RESTRICTED_JSQLPARSER},
106-
{"TIMESTAMP", RESTRICTED_JSQLPARSER}
107-
108-
, {"YEAR", RESTRICTED_JSQLPARSER}, {"MONTH", RESTRICTED_JSQLPARSER},
109-
{"DAY", RESTRICTED_JSQLPARSER}, {"HOUR", RESTRICTED_JSQLPARSER},
110-
{"MINUTE", RESTRICTED_JSQLPARSER}, {"SECOND", RESTRICTED_JSQLPARSER}
111-
112-
, {"SUBSTR", RESTRICTED_JSQLPARSER}, {"SUBSTRING", RESTRICTED_JSQLPARSER},
113-
{"TRIM", RESTRICTED_JSQLPARSER}, {"POSITION", RESTRICTED_JSQLPARSER},
114-
{"OVERLAY", RESTRICTED_JSQLPARSER}
115-
116-
, {"NEXTVAL", RESTRICTED_JSQLPARSER}
152+
{"SEL", RESTRICTED_JSQLPARSER},
153+
{"SELECT", RESTRICTED_JSQLPARSER},
154+
{"DATE", RESTRICTED_JSQLPARSER},
155+
{"TIME", RESTRICTED_JSQLPARSER},
156+
{"TIMESTAMP", RESTRICTED_JSQLPARSER},
157+
{"YEAR", RESTRICTED_JSQLPARSER},
158+
{"MONTH", RESTRICTED_JSQLPARSER},
159+
{"DAY", RESTRICTED_JSQLPARSER},
160+
{"HOUR", RESTRICTED_JSQLPARSER},
161+
{"MINUTE", RESTRICTED_JSQLPARSER},
162+
{"SECOND", RESTRICTED_JSQLPARSER},
163+
{"SUBSTR", RESTRICTED_JSQLPARSER},
164+
{"SUBSTRING", RESTRICTED_JSQLPARSER},
165+
{"TRIM", RESTRICTED_JSQLPARSER},
166+
{"POSITION", RESTRICTED_JSQLPARSER},
167+
{"OVERLAY", RESTRICTED_JSQLPARSER},
168+
{"NEXTVAL", RESTRICTED_COLUMN},
117169

118170
// @todo: Object Names should not start with Hex-Prefix, we shall not find that Token
119-
, {"0x", RESTRICTED_JSQLPARSER}
171+
{"0x", RESTRICTED_JSQLPARSER}
120172
};
121173

122174
@SuppressWarnings({"PMD.ExcessiveMethodLength"})
@@ -126,8 +178,7 @@ public static List<String> getReservedKeywords(int restriction) {
126178
int value = (int) data[1];
127179

128180
// test if bit is not set
129-
if ((value & restriction) == restriction
130-
|| (restriction & value) == value) {
181+
if ((value & restriction) == restriction || (restriction & value) == value) {
131182
keywords.add((String) data[0]);
132183
}
133184
}
@@ -136,7 +187,6 @@ public static List<String> getReservedKeywords(int restriction) {
136187
}
137188

138189
/**
139-
*
140190
* @param args with: Grammar File, Keyword Documentation File
141191
* @throws Exception
142192
*/
@@ -213,9 +263,7 @@ public static void buildGrammarForRelObjectNameWithoutValue(File file) throws Ex
213263
builder.append(" | tk=\"").append(keyword).append("\"");
214264
}
215265

216-
builder.append(" )\n"
217-
+ " { return tk.image; }\n"
218-
+ "}");
266+
builder.append(" )\n" + " { return tk.image; }\n" + "}");
219267

220268
replaceInFile(file, methodBlockPattern, builder.toString());
221269
}
@@ -244,9 +292,7 @@ public static void buildGrammarForRelObjectName(File file) throws Exception {
244292
builder.append(" | tk=\"").append(keyword).append("\"");
245293
}
246294

247-
builder.append(" )\n"
248-
+ " { return tk!=null ? tk.image : result; }\n"
249-
+ "}");
295+
builder.append(" )\n" + " { return tk!=null ? tk.image : result; }\n" + "}");
250296

251297
// @todo: Needs fine-tuning, we are not replacing this part yet
252298
// replaceInFile(file, pattern, builder.toString());
@@ -267,9 +313,7 @@ private static void replaceInFile(File file, Pattern pattern, String replacement
267313
}
268314

269315
public static String rightPadding(String input, char ch, int length) {
270-
return String
271-
.format("%" + (-length) + "s", input)
272-
.replace(' ', ch);
316+
return String.format("%" + (-length) + "s", input).replace(' ', ch);
273317
}
274318

275319
public static void writeKeywordsDocumentationFile(File file) throws IOException {
@@ -293,13 +337,15 @@ public static void writeKeywordsDocumentationFile(File file) throws IOException
293337

294338
int value = (int) keywordDefinition[1];
295339
int restriction = RESTRICTED_JSQLPARSER;
296-
String s =
297-
(value & restriction) == restriction || (restriction & value) == value ? "Yes"
298-
: "";
340+
String s = (value & restriction) == restriction || (restriction & value) == value
341+
? "Yes"
342+
: "";
299343
builder.append(rightPadding(s, ' ', 11)).append(" | ");
300344

301345
restriction = RESTRICTED_SQL2016;
302-
s = (value & restriction) == restriction || (restriction & value) == value ? "Yes" : "";
346+
s = (value & restriction) == restriction || (restriction & value) == value
347+
? "Yes"
348+
: "";
303349
builder.append(rightPadding(s, ' ', 9)).append(" | ");
304350

305351
builder.append("\n");

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,7 @@ The following tokens are allowed as Names for Schema, Table, Column and Aliases
17521752
String RelObjectNameWithoutValue() :
17531753
{ Token tk = null; }
17541754
{
1755-
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR>
1755+
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR>
17561756
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="CONVERT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GLOBAL" | tk="GRANT" | tk="GUARD" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MEMBER" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RLIKE" | tk="ROLLBACK" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRIGGER" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
17571757
{ return tk.image; }
17581758
}
@@ -1797,7 +1797,9 @@ String RelObjectNameExt():
17971797
( result=RelObjectName() | tk=<K_ALL> | tk=<K_ANY> | tk=<K_SOME> | tk=<K_LEFT> | tk=<K_RIGHT> | tk=<K_SET>
17981798
| tk=<K_DOUBLE> | tk=<K_IF> | tk=<K_IIF> | tk=<K_OPTIMIZE> | tk=<K_LIMIT>
17991799
| tk=<K_OFFSET> | tk=<K_PROCEDURE> | tk=<K_PUBLIC>
1800-
| tk=<K_CASEWHEN> | tk=<K_IN> | tk=<K_GROUPING> | tk=<K_ORDER> )
1800+
| tk=<K_CASEWHEN> | tk=<K_IN> | tk=<K_GROUPING> | tk=<K_ORDER>
1801+
| tk=<K_NEXTVAL>
1802+
)
18011803
{ return tk!=null ? tk.image : result; }
18021804
}
18031805

src/site/sphinx/keywords.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
233233
+----------------------+-------------+-----------+
234234
| OVERLAY | Yes | Yes |
235235
+----------------------+-------------+-----------+
236-
| NEXTVAL | Yes | Yes |
236+
| NEXTVAL | Yes | |
237237
+----------------------+-------------+-----------+
238238
| 0x | Yes | Yes |
239239
+----------------------+-------------+-----------+

src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,10 @@ void testPostgresQuotingIssue1335() throws JSQLParserException {
9595
"\"column\"\"with\"\"quotes\"",
9696
selectItems.get(0).getExpression(Column.class).getColumnName());
9797
}
98+
99+
@Test
100+
void testNextValueIssue1863() throws JSQLParserException {
101+
String sqlStr = "SELECT nextval('client_id_seq')";
102+
assertSqlCanBeParsedAndDeparsed(sqlStr);
103+
}
98104
}

0 commit comments

Comments
 (0)