Skip to content

Commit d20c8e9

Browse files
fix: issue #1789
- allow `CREATE TABLE ...` column parameter with Postgres`nextval('public.actor_actor_id_seq'::regclass)`
1 parent 88d1b62 commit d20c8e9

2 files changed

Lines changed: 141 additions & 111 deletions

File tree

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

Lines changed: 132 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
297297
| <K_MOVEMENT: "MOVEMENT">
298298
| <K_NATURAL:"NATURAL">
299299
| <K_NEXT:"NEXT">
300-
| <K_NEXTVAL: ( (("NEXTVAL")(" ")+("FOR")) | ( ("NEXT")(" ")+("VALUE") (" ")+("FOR") ) )>
300+
| <K_NEXTVAL: ( (("NEXTVAL")((" ")+("FOR"))?) | ( ("NEXT")(" ")+("VALUE") (" ")+("FOR") ) )>
301301
| <K_NO:"NO">
302302
| <K_NOCACHE:"NOCACHE">
303303
| <K_NOCYCLE:"NOCYCLE">
@@ -1689,6 +1689,10 @@ Column Column() #Column :
16891689
}
16901690
{
16911691
data = RelObjectNameList()
1692+
1693+
// @todo: we better should return a SEQUENCE instead of a COLUMN
1694+
[ "." <K_NEXTVAL> { data.add("nextval"); } ]
1695+
16921696
[ LOOKAHEAD(2) arrayConstructor = ArrayConstructor(false) ]
16931697
{
16941698
Column col = new Column(data);
@@ -2163,6 +2167,8 @@ SelectItem SelectItem() #SelectItem:
21632167
Alias alias = null;
21642168
}
21652169
{
2170+
// @fixme: Oracle's SEQUENCE.nextval is parsed as COLUMN with a name part nextval
2171+
// @todo: parse a proper SEQUENCE instead of a COLUMN
21662172
(
21672173
"*" { expression = new AllColumns(); }
21682174
|
@@ -5339,121 +5345,136 @@ List<String> CreateParameter():
53395345
Expression exp = null;
53405346
List<String> param = new ArrayList<String>();
53415347
ColDataType colDataType;
5348+
Function function;
53425349
}
53435350
{
5351+
(
5352+
// Postgres: nextval('public.actor_actor_id_seq'::regclass)
5353+
( <K_NEXTVAL> "(" tk=<S_CHAR_LITERAL> "::" tk2=<S_IDENTIFIER> ")" )
5354+
{
5355+
param.add("NextVal( " + tk.image + "::" + tk2.image + ")" );
5356+
}
5357+
|
53445358
(
5345-
(((tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { identifier.append(tk.image); }
5346-
["." (tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { identifier.append("."); identifier.append(tk2.image); }])
5347-
{ param.add(identifier.toString()); })
5348-
|
5349-
tk=<K_NULL> { param.add(tk.image); }
5350-
|
5351-
tk=<K_NOT> { param.add(tk.image); }
5352-
|
5353-
tk=<K_PRIMARY> { param.add(tk.image); }
5354-
|
5355-
tk=<K_DEFAULT> { param.add(tk.image); }
5356-
|
5357-
tk=<K_FOREIGN> { param.add(tk.image); }
5358-
|
5359-
tk=<K_REFERENCES> { param.add(tk.image); }
5360-
|
5361-
tk=<K_KEY> { param.add(tk.image); }
5362-
|
5363-
tk=<S_CHAR_LITERAL> { param.add(tk.image); }
5364-
|
5365-
("+" {retval = "+";} | "-" {retval = "-";})?
5366-
(
5367-
tk=<S_LONG> { retval += tk.image; }
5368-
|
5369-
tk=<S_DOUBLE> { retval += tk.image; }
5370-
)
5371-
{ param.add(retval); }
5372-
|
5373-
tk=<K_AS> (
5374-
("(" exp = Expression() ")") { param.add("AS"); param.add("(" + exp.toString() + ")");}
5375-
|
5376-
{ param.add(tk.image);}
5377-
)
5378-
|
5379-
tk=<K_STORED> { param.add(tk.image); }
5380-
|
5381-
tk=<K_ON> { param.add(tk.image); }
5382-
|
5383-
tk=<K_COMMIT> { param.add(tk.image); }
5384-
|
5385-
tk=<K_DROP> { param.add(tk.image); }
5386-
|
5387-
tk=<K_ROWS> { param.add(tk.image); }
5388-
|
5389-
tk=<K_UNIQUE> { param.add(tk.image); }
5390-
|
5391-
tk=<K_CASCADE> { param.add(tk.image); }
5392-
|
5393-
tk=<K_DELETE> { param.add(tk.image); }
5394-
|
5395-
tk=<K_UPDATE> { param.add(tk.image); }
5396-
|
5397-
tk=<K_TIME_KEY_EXPR> { param.add(new TimeKeyExpression(tk.image).toString()); }
5398-
|
5399-
"=" { param.add("="); }
5400-
|
5401-
LOOKAHEAD(3) <K_USING> <K_INDEX> <K_TABLESPACE> retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); }
5402-
|
5403-
<K_TABLESPACE> retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); }
5404-
|
5405-
retval=AList() { param.add(retval); }
5406-
|
5407-
<K_CHECK> ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");}
5408-
|
5409-
tk=<K_CONSTRAINT> { param.add(tk.image); }
5410-
|
5411-
tk=<K_WITH> { param.add(tk.image); }
5412-
|
5413-
tk=<K_EXCLUDE> { param.add(tk.image); }
5414-
|
5415-
tk=<K_WHERE> { param.add(tk.image); }
5416-
|
5417-
tk=<K_UNSIGNED> { param.add(tk.image); }
5418-
|
5419-
tk=<K_TEMP> { param.add(tk.image); }
5420-
|
5421-
tk=<K_TEMPORARY> { param.add(tk.image); }
5422-
|
5423-
tk=<K_PARTITION> { param.add(tk.image); }
5424-
|
5425-
tk=<K_BY> { param.add(tk.image); }
5426-
|
5427-
tk=<K_IN> { param.add(tk.image); }
5428-
|
5429-
tk=<K_TYPE> { param.add(tk.image); }
5430-
|
5431-
tk=<K_COMMENT> { param.add(tk.image); }
5432-
|
5433-
tk=<K_USING> { param.add(tk.image); }
5434-
|
5435-
tk=<K_COLLATE> { param.add(tk.image); }
5436-
|
5437-
tk=<K_ASC> { param.add(tk.image); }
5438-
|
5439-
tk=<K_DESC> { param.add(tk.image); }
5440-
|
5441-
tk=<K_TRUE> { param.add(tk.image); }
5442-
|
5443-
tk=<K_FALSE> { param.add(tk.image); }
5444-
|
5445-
tk=<K_PARALLEL> { param.add(tk.image); }
5446-
|
5447-
tk=<K_BINARY> { param.add(tk.image); }
5448-
|
5449-
tk=<K_START> { param.add(tk.image); }
5450-
|
5451-
(tk=<K_CHARACTER> tk2=<K_SET>) { param.add(tk.image); param.add(tk2.image);}
5452-
|
5453-
(<K_ARRAY_LITERAL> exp=ArrayConstructor(true)) { param.add(exp.toString()); }
5359+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
5360+
{ identifier.append(tk.image); }
5361+
5362+
[
5363+
"."
5364+
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>)
5365+
{ identifier.append("."); identifier.append(tk2.image); }
5366+
]
5367+
{ param.add(identifier.toString()); }
5368+
)
5369+
|
5370+
tk=<K_NULL> { param.add(tk.image); }
5371+
|
5372+
tk=<K_NOT> { param.add(tk.image); }
5373+
|
5374+
tk=<K_PRIMARY> { param.add(tk.image); }
5375+
|
5376+
tk=<K_DEFAULT> { param.add(tk.image); }
5377+
|
5378+
tk=<K_FOREIGN> { param.add(tk.image); }
5379+
|
5380+
tk=<K_REFERENCES> { param.add(tk.image); }
5381+
|
5382+
tk=<K_KEY> { param.add(tk.image); }
5383+
|
5384+
tk=<S_CHAR_LITERAL> { param.add(tk.image); }
5385+
|
5386+
("+" {retval = "+";} | "-" {retval = "-";})?
5387+
(
5388+
tk=<S_LONG> { retval += tk.image; }
5389+
|
5390+
tk=<S_DOUBLE> { retval += tk.image; }
5391+
)
5392+
{ param.add(retval); }
5393+
|
5394+
tk=<K_AS> (
5395+
("(" exp = Expression() ")") { param.add("AS"); param.add("(" + exp.toString() + ")");}
54545396
|
5455-
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
5397+
{ param.add(tk.image);}
54565398
)
5399+
|
5400+
tk=<K_STORED> { param.add(tk.image); }
5401+
|
5402+
tk=<K_ON> { param.add(tk.image); }
5403+
|
5404+
tk=<K_COMMIT> { param.add(tk.image); }
5405+
|
5406+
tk=<K_DROP> { param.add(tk.image); }
5407+
|
5408+
tk=<K_ROWS> { param.add(tk.image); }
5409+
|
5410+
tk=<K_UNIQUE> { param.add(tk.image); }
5411+
|
5412+
tk=<K_CASCADE> { param.add(tk.image); }
5413+
|
5414+
tk=<K_DELETE> { param.add(tk.image); }
5415+
|
5416+
tk=<K_UPDATE> { param.add(tk.image); }
5417+
|
5418+
tk=<K_TIME_KEY_EXPR> { param.add(new TimeKeyExpression(tk.image).toString()); }
5419+
|
5420+
"=" { param.add("="); }
5421+
|
5422+
LOOKAHEAD(3) <K_USING> <K_INDEX> <K_TABLESPACE> retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); }
5423+
|
5424+
<K_TABLESPACE> retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); }
5425+
|
5426+
retval=AList() { param.add(retval); }
5427+
|
5428+
<K_CHECK> ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");}
5429+
|
5430+
tk=<K_CONSTRAINT> { param.add(tk.image); }
5431+
|
5432+
tk=<K_WITH> { param.add(tk.image); }
5433+
|
5434+
tk=<K_EXCLUDE> { param.add(tk.image); }
5435+
|
5436+
tk=<K_WHERE> { param.add(tk.image); }
5437+
|
5438+
tk=<K_UNSIGNED> { param.add(tk.image); }
5439+
|
5440+
tk=<K_TEMP> { param.add(tk.image); }
5441+
|
5442+
tk=<K_TEMPORARY> { param.add(tk.image); }
5443+
|
5444+
tk=<K_PARTITION> { param.add(tk.image); }
5445+
|
5446+
tk=<K_BY> { param.add(tk.image); }
5447+
|
5448+
tk=<K_IN> { param.add(tk.image); }
5449+
|
5450+
tk=<K_TYPE> { param.add(tk.image); }
5451+
|
5452+
tk=<K_COMMENT> { param.add(tk.image); }
5453+
|
5454+
tk=<K_USING> { param.add(tk.image); }
5455+
|
5456+
tk=<K_COLLATE> { param.add(tk.image); }
5457+
|
5458+
tk=<K_ASC> { param.add(tk.image); }
5459+
|
5460+
tk=<K_DESC> { param.add(tk.image); }
5461+
|
5462+
tk=<K_TRUE> { param.add(tk.image); }
5463+
|
5464+
tk=<K_FALSE> { param.add(tk.image); }
5465+
|
5466+
tk=<K_PARALLEL> { param.add(tk.image); }
5467+
|
5468+
tk=<K_BINARY> { param.add(tk.image); }
5469+
|
5470+
tk=<K_START> { param.add(tk.image); }
5471+
|
5472+
(tk=<K_CHARACTER> tk2=<K_SET>) { param.add(tk.image); param.add(tk2.image);}
5473+
|
5474+
(<K_ARRAY_LITERAL> exp=ArrayConstructor(true)) { param.add(exp.toString()); }
5475+
|
5476+
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
5477+
)
54575478
{return param;}
54585479
}
54595480

src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,4 +979,13 @@ void testCreateTableWithStartWithNumber() throws JSQLParserException {
979979
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
980980
}
981981

982+
@Test
983+
void testCreateTableWithNextValueFor() throws JSQLParserException {
984+
String sqlStr =
985+
"CREATE TABLE public.actor (\n"
986+
+ " actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL\n"
987+
+ ")";
988+
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
989+
}
990+
982991
}

0 commit comments

Comments
 (0)