@@ -1440,6 +1440,11 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
14401440 return isKeywordAhead("MATCH_RECOGNIZE") && getToken(2).kind == OPENING_BRACKET;
14411441 }
14421442
1443+ private boolean isCreateTableQueryPrefix() {
1444+ int kind = getToken(1).kind;
1445+ return kind == K_AS || kind == K_TABLE || kind == K_IGNORE || kind == K_REPLACE;
1446+ }
1447+
14431448 private boolean isRowPatternPrimaryAhead() {
14441449 Token next = getToken(1);
14451450 return next.kind == OPENING_BRACKET || next.kind == OP_CARET
@@ -14143,8 +14148,7 @@ ColumnOption ColumnDefinitionOption(): {
1414314148 LOOKAHEAD(<K_PRIMARY> <K_KEY>) <K_PRIMARY> <K_KEY>
1414414149 { option = ColumnOption.constraint(new NamedConstraint().withType("PRIMARY KEY")); }
1414514150 |
14146- LOOKAHEAD([ <K_CONSTRAINT> RelObjectName() ] <K_CHECK>,
14147- { Dialect.POSTGRESQL.name().equals(getAsString(Feature.dialect)) })
14151+ LOOKAHEAD([ <K_CONSTRAINT> RelObjectName() ] <K_CHECK>)
1414814152 [ <K_CONSTRAINT> constraintName=RelObjectName() ]
1414914153 constraint=CheckConstraintSpec(constraintName)
1415014154 { option = ColumnOption.constraint(constraint); }
@@ -14217,7 +14221,9 @@ IdentityDefinition IdentityDefinition():
1421714221 Token token;
1421814222 IdentityDefinition.GenerationMode mode;
1421914223 IdentityDefinition identity;
14220- List<Sequence.Parameter> parameters;
14224+ List<Sequence.Parameter> parameters = new ArrayList<Sequence.Parameter>();
14225+ Sequence.Parameter parameter;
14226+ Sequence sequenceName;
1422114227}
1422214228{
1422314229 token=<S_IDENTIFIER> {
@@ -14226,8 +14232,18 @@ IdentityDefinition IdentityDefinition():
1422614232 ( <K_ALWAYS> { mode = IdentityDefinition.GenerationMode.ALWAYS; }
1422714233 | <K_BY> <K_DEFAULT> { mode = IdentityDefinition.GenerationMode.BY_DEFAULT; } )
1422814234 <K_AS> <K_IDENTITY> { identity = new IdentityDefinition(mode); }
14229- [ LOOKAHEAD(2) "(" parameters=SequenceParameters() ")" {
14230- requireDdlSyntax(!parameters.isEmpty(), "Expected an identity sequence parameter");
14235+ [ LOOKAHEAD(1) "("
14236+ (
14237+ (
14238+ LOOKAHEAD(<K_SEQUENCE> <K_NAME>)
14239+ <K_SEQUENCE> <K_NAME> sequenceName=Sequence()
14240+ { parameter = new Sequence.Parameter(Sequence.ParameterType.SEQUENCE_NAME)
14241+ .withSequenceName(sequenceName); }
14242+ | parameter=SequenceParameter()
14243+ )
14244+ { parameters.add(parameter); }
14245+ )+
14246+ ")" {
1423114247 identity.setParameters(parameters);
1423214248 } ]
1423314249 { return identity; }
@@ -14970,6 +14986,7 @@ CreateTable CreateTable(boolean isUsingOrReplace):
1497014986 ColDataType ofType = null;
1497114987 Table parent;
1497214988 List<Table> parents = new ArrayList<Table>();
14989+ boolean withData;
1497314990}
1497414991{
1497514992 { createTable.setOrReplace(isUsingOrReplace);}
@@ -15026,9 +15043,14 @@ CreateTable CreateTable(boolean isUsingOrReplace):
1502615043 [ rowMovement = RowMovement() { createTable.setRowMovement(rowMovement); }]
1502715044 [ LOOKAHEAD(2)
1502815045 { createTable.setUseAsKeyword(false); }
15046+ [ ( tk=<K_IGNORE> | tk=<K_REPLACE> )
15047+ { createTable.setDuplicateHandling(CreateTable.DuplicateHandling.valueOf(
15048+ tk.image.toUpperCase(Locale.ROOT))); } ]
1502915049 [ <K_AS> { createTable.setUseAsKeyword(true); } ]
1503015050 ( LOOKAHEAD(<K_TABLE>) select=TableStatement() | select=Select() )
1503115051 { createTable.setSelect(select, false); }
15052+ [ LOOKAHEAD(2) <K_WITH> withData=DataPopulation()
15053+ { createTable.setWithData(withData); } ]
1503215054 ]
1503315055 [
1503415056 <K_LIKE> ( LOOKAHEAD("(" Table() ")") "(" likeTable=Table() { createTable.setLikeTable(likeTable, true); } ")"
@@ -15087,10 +15109,10 @@ ColumnDefinition CreateTableColumnDefinition(boolean typed):
1508715109void CreateTableOptions(List<TableOption> options):
1508815110{ TableOption option; }
1508915111{
15090- [ LOOKAHEAD(2, { getToken(1).kind != K_AS && getToken(1).kind != K_TABLE
15112+ [ LOOKAHEAD(2, { !isCreateTableQueryPrefix()
1509115113 && !(getToken(1).kind == K_PARTITION && getToken(2).kind == K_BY) })
1509215114 option=CreateTableOption() { options.add(option); }
15093- ( LOOKAHEAD(2, { getToken(1).kind != K_AS && getToken(1).kind != K_TABLE
15115+ ( LOOKAHEAD(2, { !isCreateTableQueryPrefix()
1509415116 && !(getToken(1).kind == K_PARTITION && getToken(2).kind == K_BY)
1509515117 && !(getToken(1).kind == K_COMMA
1509615118 && "INTERLEAVE".equalsIgnoreCase(getToken(2).image)) })
@@ -15619,7 +15641,7 @@ CreateView CreateView(boolean isUsingOrReplace):
1561915641 List<Index.Option> storageParameters = null;
1562015642 List<ViewOption> viewOptions = new ArrayList<ViewOption>();
1562115643 ViewOption viewOption = null;
15622- boolean withData = true ;
15644+ boolean withData;
1562315645}
1562415646{
1562515647 { createView.setOrReplace(isUsingOrReplace);}
@@ -15674,7 +15696,7 @@ CreateView CreateView(boolean isUsingOrReplace):
1567415696 }
1567515697 }
1567615698 |
15677- [ <K_NO> { withData = false; } ] <K_DATA> { createView.setWithData(withData); }
15699+ withData=DataPopulation() { createView.setWithData(withData); }
1567815700 )
1567915701 ]
1568015702 { createView.validateOptions(); return createView; }
@@ -15692,6 +15714,14 @@ ViewOption PostgreSqlViewOption():
1569215714 { return new ViewOption(name, value, useEquals); }
1569315715}
1569415716
15717+ /** Shared WITH [NO] DATA tail for table and materialized-view query sources. */
15718+ boolean DataPopulation():
15719+ { boolean withData = true; }
15720+ {
15721+ [ <K_NO> { withData = false; } ] <K_DATA>
15722+ { return withData; }
15723+ }
15724+
1569515725List<String> CreateViewTailComment():
1569615726{
1569715727 Token tk = null;
@@ -15739,21 +15769,32 @@ ReferentialAction.Action Action():
1573915769 * Shared between CREATE TABLE FK and ALTER TABLE FK definitions.
1574015770 */
1574115771void ReferentialActions(ForeignKeyReference reference):
15772+ {}
1574215773{
15743- Token tk;
15744- ReferentialAction.Action action = null;
15774+ [ LOOKAHEAD(2) ReferentialActionSpec(reference) ]
15775+ [ LOOKAHEAD(2) ReferentialActionSpec(reference) ]
1574515776}
15777+
15778+ void ReferentialActionSpec(ForeignKeyReference reference):
1574615779{
15747- [ LOOKAHEAD(2) (
15748- <K_ON>
15749- ( tk=<K_DELETE> | tk=<K_UPDATE> ) action = Action()
15750- { reference.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
15751- )]
15752- [ LOOKAHEAD(2) (
15753- <K_ON>
15754- ( tk=<K_DELETE> | tk=<K_UPDATE> ) action = Action()
15755- { reference.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
15756- )]
15780+ Token token;
15781+ ReferentialAction.Type type;
15782+ ReferentialAction.Action action;
15783+ List<String> columnNames = null;
15784+ }
15785+ {
15786+ <K_ON> ( token=<K_DELETE> | token=<K_UPDATE> )
15787+ { type = ReferentialAction.Type.from(token.image); }
15788+ action=Action()
15789+ [ LOOKAHEAD({ type == ReferentialAction.Type.DELETE
15790+ && (action == ReferentialAction.Action.SET_NULL
15791+ || action == ReferentialAction.Action.SET_DEFAULT)
15792+ && "(".equals(getToken(1).image) })
15793+ columnNames=ColumnsNamesList() ]
15794+ {
15795+ reference.setReferentialAction(type, action);
15796+ reference.getReferentialAction(type).setColumnNames(columnNames);
15797+ }
1575715798}
1575815799
1575915800ForeignKeyReference ForeignKeyReferenceSpec():
@@ -16614,7 +16655,7 @@ TablePartitioning CreateTablePartitioning():
1661416655 ]
1661516656 [ LOOKAHEAD(2) partitionDefinitions=PartitionDefinitions()
1661616657 { partitioning.setPartitionDefinitions(partitionDefinitions); } ]
16617- ( LOOKAHEAD(2, { getToken(1).kind != K_AS })
16658+ ( LOOKAHEAD(2, { !isCreateTableQueryPrefix() })
1661816659 parameter=CreateParameter() { partitionOptions.addAll(parameter); } )*
1661916660 {
1662016661 if (!partitionOptions.isEmpty()) {
0 commit comments