@@ -63,6 +63,7 @@ import net.sf.jsqlparser.statement.create.event.*;
6363import net.sf.jsqlparser.statement.create.function.*;
6464import net.sf.jsqlparser.statement.create.index.*;
6565import net.sf.jsqlparser.statement.create.macro.*;
66+ import net.sf.jsqlparser.statement.create.statistics.CreateStatistics;
6667import net.sf.jsqlparser.statement.create.policy.*;
6768import net.sf.jsqlparser.statement.create.procedure.*;
6869import net.sf.jsqlparser.statement.create.schema.*;
@@ -18169,6 +18170,8 @@ Statement Alter():
1816918170 (
1817018171 <K_ALTER>
1817118172 (
18173+ LOOKAHEAD({ isKeywordAhead("STATISTICS") }) statement = AlterStatistics()
18174+ |
1817218175 LOOKAHEAD({ isKeywordAhead("ROLE") || isKeywordAhead("USER") || isKeywordAhead("GROUP") })
1817318176 statement = AlterRole()
1817418177 |
@@ -19131,6 +19134,8 @@ Statement Create():
1913119134{
1913219135 <K_CREATE> [ <K_OR> <K_REPLACE> { isUsingOrReplace = true; } ]
1913319136 (
19137+ LOOKAHEAD({ isKeywordAhead("STATISTICS") }) statement = CreateStatistics()
19138+ |
1913419139 LOOKAHEAD({ isPostgreSqlRoleAhead() }) statement = CreateRole()
1913519140 { requireAccessSyntax(!isUsingOrReplace, "CREATE ROLE does not accept OR REPLACE"); }
1913619141 |
@@ -20366,3 +20371,48 @@ String TimeTravelAfterAlias():
2036620371 return builder.toString();
2036720372 }
2036820373}
20374+
20375+ CreateStatistics CreateStatistics():
20376+ {
20377+ CreateStatistics statement = new CreateStatistics();
20378+ String name; CreateStatistics.Kind kind; Expression expression; Table table;
20379+ }
20380+ {
20381+ ContextualKeyword("STATISTICS")
20382+ [ LOOKAHEAD(2) <K_IF> <K_NOT> <K_EXISTS> { statement.setIfNotExists(true); } ]
20383+ [ LOOKAHEAD({ getToken(1).kind != K_ON && getToken(1).kind != OPENING_BRACKET })
20384+ name=TypeDdlName() { statement.setName(name); } ]
20385+ [ "(" name=RelObjectName() { kind=accessEnum(CreateStatistics.Kind.class,name); statement.getKinds().add(kind); }
20386+ ( "," name=RelObjectName() { kind=accessEnum(CreateStatistics.Kind.class,name);
20387+ requireDdlSyntax(!statement.getKinds().contains(kind),"Duplicate statistics kind"); statement.getKinds().add(kind); } )* ")" ]
20388+ <K_ON> expression=PostgreSqlStatisticsExpression() { statement.getExpressions().add(expression); }
20389+ ( "," expression=PostgreSqlStatisticsExpression() { statement.getExpressions().add(expression); } )*
20390+ <K_FROM> table=Table() { statement.setTable(table); }
20391+ {
20392+ requireDdlSyntax(!statement.isIfNotExists() || statement.getName()!=null,"IF NOT EXISTS requires a statistics name");
20393+ requireDdlSyntax(statement.getExpressions().size()>1 || statement.getKinds().isEmpty()
20394+ && statement.getExpressions().get(0) instanceof ParenthesedExpressionList,
20395+ "Single-expression statistics require a parenthesized expression and no explicit kinds");
20396+ return statement;
20397+ }
20398+ }
20399+ Expression PostgreSqlStatisticsExpression():
20400+ { Expression expression; String name; }
20401+ {
20402+ ( "(" expression=Expression() ")" { expression = new ParenthesedExpressionList<Expression>(expression); }
20403+ | name=RelObjectName() { expression = createColumn(name); } )
20404+ { return expression; }
20405+ }
20406+ AlterStatistics AlterStatistics():
20407+ { AlterStatistics statement = new AlterStatistics(); String name; Long target; }
20408+ {
20409+ ContextualKeyword("STATISTICS") name=TypeDdlName() { statement.setName(name); }
20410+ ( <K_RENAME> <K_TO> name=RelObjectName() { statement.setAction(AlterStatistics.Action.RENAME); statement.setNewName(name); }
20411+ | ContextualKeyword("OWNER") <K_TO> name=RelObjectName() { statement.setAction(AlterStatistics.Action.OWNER); statement.setOwner(name); }
20412+ | <K_SET> ( <K_SCHEMA> name=RelObjectName() { statement.setAction(AlterStatistics.Action.SET_SCHEMA); statement.setSchemaName(name); }
20413+ | ContextualKeyword("STATISTICS") { statement.setAction(AlterStatistics.Action.SET_STATISTICS); }
20414+ ( <K_DEFAULT> | target=SequenceParameterValue() {
20415+ requireDdlSyntax(target>=-1 && target<=10000,"Statistics target must be DEFAULT or between -1 and 10000");
20416+ statement.setStatistics(target.intValue()); } ) ) )
20417+ { return statement; }
20418+ }
0 commit comments