@@ -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 |
@@ -19565,8 +19567,8 @@ ColDataType.TypeModifier MySqlTypeModifier():
1956519567}
1956619568
1956719569/**
19568- * Parses MySQL/MariaDB CHECK, OPTIMIZE and REPAIR TABLE statements. Options are accepted only for
19569- * the operation that defines them, without reserving the option words.
19570+ * Parses MySQL/MariaDB CHECK, CHECKSUM, OPTIMIZE and REPAIR TABLE statements. Options are accepted
19571+ * only for the operation that defines them, without reserving the option words.
1957019572 */
1957119573TableMaintenanceStatement TableMaintenanceStatement():
1957219574{
@@ -19580,6 +19582,7 @@ TableMaintenanceStatement TableMaintenanceStatement():
1958019582{
1958119583 (
1958219584 <K_CHECK> { operation = TableMaintenanceStatement.Operation.CHECK; }
19585+ | <K_CHECKSUM> { operation = TableMaintenanceStatement.Operation.CHECKSUM; }
1958319586 | <K_OPTIMIZE> { operation = TableMaintenanceStatement.Operation.OPTIMIZE; }
1958419587 | <K_REPAIR> { operation = TableMaintenanceStatement.Operation.REPAIR; }
1958519588 )
@@ -19607,7 +19610,11 @@ TableMaintenanceStatement TableMaintenanceStatement():
1960719610 )
1960819611 { statement.addOptions(option); }
1960919612 )*
19610- { return statement; }
19613+ {
19614+ requireDdlSyntax(operation != TableMaintenanceStatement.Operation.CHECKSUM
19615+ || statement.getOptions().size() <= 1, "CHECKSUM TABLE takes QUICK or EXTENDED, not both");
19616+ return statement;
19617+ }
1961119618}
1961219619
1961319620Analyze Analyze():
@@ -19618,6 +19625,7 @@ Analyze Analyze():
1961819625 Token modifier = null;
1961919626 Token histogramAction = null;
1962019627 Token bucketCount = null;
19628+ Token data;
1962119629}
1962219630{
1962319631 <K_ANALYZE>
@@ -19639,11 +19647,28 @@ Analyze Analyze():
1963919647 <K_HISTOGRAM> <K_ON>
1964019648 column=Column() { analyze.addHistogramColumns(column); }
1964119649 ( "," column=Column() { analyze.addHistogramColumns(column); } )*
19642- [
19643- LOOKAHEAD(3)
19644- <K_WITH> bucketCount=<S_LONG> <K_BUCKETS>
19645- { analyze.setHistogramBucketCount(Integer.valueOf(bucketCount.image)); }
19646- ]
19650+ (
19651+ // MySQL 8.4 sets a histogram from JSON instead of sampling the column
19652+ LOOKAHEAD(2) <K_USING> <K_DATA> data=<S_CHAR_LITERAL> {
19653+ requireDdlSyntax(histogramAction.kind == K_UPDATE, "USING DATA requires UPDATE HISTOGRAM");
19654+ analyze.setHistogramData(stringValue(data));
19655+ }
19656+ |
19657+ [
19658+ LOOKAHEAD(3)
19659+ <K_WITH> bucketCount=<S_LONG> <K_BUCKETS>
19660+ { analyze.setHistogramBucketCount(Integer.valueOf(bucketCount.image)); }
19661+ ]
19662+ [
19663+ LOOKAHEAD({ (getToken(1).kind == K_AUTO || isKeywordAhead("MANUAL"))
19664+ && getToken(2).kind == K_UPDATE })
19665+ ( <K_AUTO> { analyze.setHistogramUpdateMode(Analyze.HistogramUpdateMode.AUTO); }
19666+ | ContextualKeyword("MANUAL") { analyze.setHistogramUpdateMode(Analyze.HistogramUpdateMode.MANUAL); } )
19667+ <K_UPDATE> {
19668+ requireDdlSyntax(histogramAction.kind == K_UPDATE, "AUTO UPDATE and MANUAL UPDATE require UPDATE HISTOGRAM");
19669+ }
19670+ ]
19671+ )
1964719672 ]
1964819673
1964919674 {
0 commit comments