diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index e6fb48c37..cdbeb0ef7 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -297,7 +297,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | -| +| | | | @@ -1689,6 +1689,10 @@ Column Column() #Column : } { data = RelObjectNameList() + + // @todo: we better should return a SEQUENCE instead of a COLUMN + [ "." { data.add("nextval"); } ] + [ LOOKAHEAD(2) arrayConstructor = ArrayConstructor(false) ] { Column col = new Column(data); @@ -2163,6 +2167,8 @@ SelectItem SelectItem() #SelectItem: Alias alias = null; } { + // @fixme: Oracle's SEQUENCE.nextval is parsed as COLUMN with a name part nextval + // @todo: parse a proper SEQUENCE instead of a COLUMN ( "*" { expression = new AllColumns(); } | @@ -5339,121 +5345,136 @@ List CreateParameter(): Expression exp = null; List param = new ArrayList(); ColDataType colDataType; + Function function; } { + ( + // Postgres: nextval('public.actor_actor_id_seq'::regclass) + ( "(" tk= "::" tk2= ")" ) + { + param.add("NextVal( " + tk.image + "::" + tk2.image + ")" ); + } + | ( - (((tk= | tk=) { identifier.append(tk.image); } - ["." (tk2= | tk2=) { identifier.append("."); identifier.append(tk2.image); }]) - { param.add(identifier.toString()); }) - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - ("+" {retval = "+";} | "-" {retval = "-";})? - ( - tk= { retval += tk.image; } - | - tk= { retval += tk.image; } - ) - { param.add(retval); } - | - tk= ( - ("(" exp = Expression() ")") { param.add("AS"); param.add("(" + exp.toString() + ")");} - | - { param.add(tk.image);} - ) - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(new TimeKeyExpression(tk.image).toString()); } - | - "=" { param.add("="); } - | - LOOKAHEAD(3) retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); } - | - retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); } - | - retval=AList() { param.add(retval); } - | - ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");} - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - (tk= tk2=) { param.add(tk.image); param.add(tk2.image);} - | - ( exp=ArrayConstructor(true)) { param.add(exp.toString()); } + (tk= | tk=) + { identifier.append(tk.image); } + + [ + "." + (tk2= | tk2=) + { identifier.append("."); identifier.append(tk2.image); } + ] + { param.add(identifier.toString()); } + ) + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + ("+" {retval = "+";} | "-" {retval = "-";})? + ( + tk= { retval += tk.image; } + | + tk= { retval += tk.image; } + ) + { param.add(retval); } + | + tk= ( + ("(" exp = Expression() ")") { param.add("AS"); param.add("(" + exp.toString() + ")");} | - tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); } + { param.add(tk.image);} ) + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(new TimeKeyExpression(tk.image).toString()); } + | + "=" { param.add("="); } + | + LOOKAHEAD(3) retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); } + | + retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); } + | + retval=AList() { param.add(retval); } + | + ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");} + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + (tk= tk2=) { param.add(tk.image); param.add(tk2.image);} + | + ( exp=ArrayConstructor(true)) { param.add(exp.toString()); } + | + tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); } + ) {return param;} } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java index 368173f43..6cb0d70d9 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java @@ -979,4 +979,13 @@ void testCreateTableWithStartWithNumber() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + @Test + void testCreateTableWithNextValueFor() throws JSQLParserException { + String sqlStr = + "CREATE TABLE public.actor (\n" + + " actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL\n" + + ")"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + }