@@ -2498,17 +2498,18 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
24982498 }
24992499
25002500 /**
2501- * Whether a MySQL CHECK, OPTIMIZE or REPAIR TABLE statement starts here. TABLE or TABLES must
2502- * follow, so other uses of these words are unaffected.
2501+ * Whether a MySQL CHECK, CHECKSUM, OPTIMIZE or REPAIR TABLE statement starts here. TABLE or
2502+ * TABLES must follow, so other uses of these words are unaffected.
25032503 */
25042504 private boolean isTableMaintenanceAhead() {
25052505 int kind = getToken(1).kind;
2506- if (kind != K_CHECK && kind != K_OPTIMIZE && kind != K_REPAIR) {
2506+ if (kind != K_CHECK && kind != K_CHECKSUM && kind != K_OPTIMIZE && kind != K_REPAIR) {
25072507 return false;
25082508 }
25092509 int offset = 2;
25102510 int modifier = getToken(2).kind;
2511- if (kind != K_CHECK && (modifier == K_NO_WRITE_TO_BINLOG || modifier == K_LOCAL)) {
2511+ if ((kind == K_OPTIMIZE || kind == K_REPAIR)
2512+ && (modifier == K_NO_WRITE_TO_BINLOG || modifier == K_LOCAL)) {
25122513 offset = 3;
25132514 }
25142515 int table = getToken(offset).kind;
@@ -4033,6 +4034,7 @@ String NonReservedWordPart1() :
40334034 | tk=<K_CHANGE:"CHANGE">
40344035 | tk=<K_CHANGES:"CHANGES">
40354036 | tk=<K_CHECKPOINT:"CHECKPOINT">
4037+ | tk=<K_CHECKSUM:"CHECKSUM">
40364038 | tk=<K_CHAR:"CHAR">
40374039 | tk=<K_CLOSE:"CLOSE">
40384040 | tk=<K_CLOUD:"CLOUD">
@@ -19086,7 +19088,7 @@ TableOption MySqlAdditionalTableOption():
1908619088 value=MySqlSizeNumber()
1908719089 |
1908819090 LOOKAHEAD({ isKeywordAhead("CHECKSUM") || isKeywordAhead("DELAY_KEY_WRITE") })
19089- token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
19091+ ( token=<K_CHECKSUM> | token=< S_IDENTIFIER> ) { name = token.image.toUpperCase(Locale.ROOT); }
1909019092 [ "=" { useEquals = true; } ]
1909119093 token=<S_LONG> { value = token.image; }
1909219094 |
@@ -19556,8 +19558,8 @@ ColDataType.TypeModifier MySqlTypeModifier():
1955619558}
1955719559
1955819560/**
19559- * Parses MySQL/MariaDB CHECK, OPTIMIZE and REPAIR TABLE statements. Options are accepted only for
19560- * the operation that defines them, without reserving the option words.
19561+ * Parses MySQL/MariaDB CHECK, CHECKSUM, OPTIMIZE and REPAIR TABLE statements. Options are accepted
19562+ * only for the operation that defines them, without reserving the option words.
1956119563 */
1956219564TableMaintenanceStatement TableMaintenanceStatement():
1956319565{
@@ -19571,6 +19573,7 @@ TableMaintenanceStatement TableMaintenanceStatement():
1957119573{
1957219574 (
1957319575 <K_CHECK> { operation = TableMaintenanceStatement.Operation.CHECK; }
19576+ | <K_CHECKSUM> { operation = TableMaintenanceStatement.Operation.CHECKSUM; }
1957419577 | <K_OPTIMIZE> { operation = TableMaintenanceStatement.Operation.OPTIMIZE; }
1957519578 | <K_REPAIR> { operation = TableMaintenanceStatement.Operation.REPAIR; }
1957619579 )
@@ -19598,7 +19601,11 @@ TableMaintenanceStatement TableMaintenanceStatement():
1959819601 )
1959919602 { statement.addOptions(option); }
1960019603 )*
19601- { return statement; }
19604+ {
19605+ requireDdlSyntax(operation != TableMaintenanceStatement.Operation.CHECKSUM
19606+ || statement.getOptions().size() <= 1, "CHECKSUM TABLE takes QUICK or EXTENDED, not both");
19607+ return statement;
19608+ }
1960219609}
1960319610
1960419611Analyze Analyze():
@@ -19609,6 +19616,7 @@ Analyze Analyze():
1960919616 Token modifier = null;
1961019617 Token histogramAction = null;
1961119618 Token bucketCount = null;
19619+ Token data;
1961219620}
1961319621{
1961419622 <K_ANALYZE>
@@ -19630,11 +19638,28 @@ Analyze Analyze():
1963019638 <K_HISTOGRAM> <K_ON>
1963119639 column=Column() { analyze.addHistogramColumns(column); }
1963219640 ( "," column=Column() { analyze.addHistogramColumns(column); } )*
19633- [
19634- LOOKAHEAD(3)
19635- <K_WITH> bucketCount=<S_LONG> <K_BUCKETS>
19636- { analyze.setHistogramBucketCount(Integer.valueOf(bucketCount.image)); }
19637- ]
19641+ (
19642+ // MySQL 8.4 sets a histogram from JSON instead of sampling the column
19643+ LOOKAHEAD(2) <K_USING> <K_DATA> data=<S_CHAR_LITERAL> {
19644+ requireDdlSyntax(histogramAction.kind == K_UPDATE, "USING DATA requires UPDATE HISTOGRAM");
19645+ analyze.setHistogramData(stringValue(data));
19646+ }
19647+ |
19648+ [
19649+ LOOKAHEAD(3)
19650+ <K_WITH> bucketCount=<S_LONG> <K_BUCKETS>
19651+ { analyze.setHistogramBucketCount(Integer.valueOf(bucketCount.image)); }
19652+ ]
19653+ [
19654+ LOOKAHEAD({ (getToken(1).kind == K_AUTO || isKeywordAhead("MANUAL"))
19655+ && getToken(2).kind == K_UPDATE })
19656+ ( <K_AUTO> { analyze.setHistogramUpdateMode(Analyze.HistogramUpdateMode.AUTO); }
19657+ | ContextualKeyword("MANUAL") { analyze.setHistogramUpdateMode(Analyze.HistogramUpdateMode.MANUAL); } )
19658+ <K_UPDATE> {
19659+ requireDdlSyntax(histogramAction.kind == K_UPDATE, "AUTO UPDATE and MANUAL UPDATE require UPDATE HISTOGRAM");
19660+ }
19661+ ]
19662+ )
1963819663 ]
1963919664
1964019665 {
0 commit comments