Skip to content

Support [FIRST | AFTER column_name] support in ALTER TABLE for MySQL #1180

Merged
alamb merged 2 commits intoapache:mainfrom
xring:feat-add-mysql-first-after-support-in-alter-table-column
Apr 7, 2024
Merged

Support [FIRST | AFTER column_name] support in ALTER TABLE for MySQL #1180
alamb merged 2 commits intoapache:mainfrom
xring:feat-add-mysql-first-after-support-in-alter-table-column

Conversation

@xring
Copy link
Copy Markdown
Contributor

@xring xring commented Mar 15, 2024

As per MySQL doc, the ALTER TABLE Statement has the definition:

ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]
    [partition_options]

alter_option: {
    table_options
  | ADD [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | ADD [COLUMN] (col_name column_definition,...)
  | ADD {INDEX | KEY} [index_name]
        [index_type] (key_part,...) [index_option] ...
  | ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
        (key_part,...) [index_option] ...
  | ADD [CONSTRAINT [symbol]] PRIMARY KEY
        [index_type] (key_part,...)
        [index_option] ...
  | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
        [index_name] [index_type] (key_part,...)
        [index_option] ...
  | ADD [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (col_name,...)
        reference_definition
  | ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
  | DROP {CHECK | CONSTRAINT} symbol
  | ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
  | ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
  | ALTER [COLUMN] col_name {
        SET DEFAULT {literal | (expr)}
      | SET {VISIBLE | INVISIBLE}
      | DROP DEFAULT
    }
  | ALTER INDEX index_name {VISIBLE | INVISIBLE}
  | CHANGE [COLUMN] old_col_name new_col_name column_definition
        [FIRST | AFTER col_name]
  | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | {DISABLE | ENABLE} KEYS
  | {DISCARD | IMPORT} TABLESPACE
  | DROP [COLUMN] col_name
  | DROP {INDEX | KEY} index_name
  | DROP PRIMARY KEY
  | DROP FOREIGN KEY fk_symbol
  | FORCE
  | LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
  | MODIFY [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | ORDER BY col_name [, col_name] ...
  | RENAME COLUMN old_col_name TO new_col_name
  | RENAME {INDEX | KEY} old_index_name TO new_index_name
  | RENAME [TO | AS] new_tbl_name
  | {WITHOUT | WITH} VALIDATION
}

partition_options:
    partition_option [partition_option] ...

partition_option: {
    ADD PARTITION (partition_definition)
  | DROP PARTITION partition_names
  | DISCARD PARTITION {partition_names | ALL} TABLESPACE
  | IMPORT PARTITION {partition_names | ALL} TABLESPACE
  | TRUNCATE PARTITION {partition_names | ALL}
  | COALESCE PARTITION number
  | REORGANIZE PARTITION partition_names INTO (partition_definitions)
  | EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
  | ANALYZE PARTITION {partition_names | ALL}
  | CHECK PARTITION {partition_names | ALL}
  | OPTIMIZE PARTITION {partition_names | ALL}
  | REBUILD PARTITION {partition_names | ALL}
  | REPAIR PARTITION {partition_names | ALL}
  | REMOVE PARTITIONING
}

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
}

table_options:
    table_option [[,] table_option] ...

table_option: {
    AUTOEXTEND_SIZE [=] value
  | AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0 | 1}
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
  | CONNECTION [=] 'connect_string'
  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | ENCRYPTION [=] {'Y' | 'N'}
  | ENGINE [=] engine_name
  | ENGINE_ATTRIBUTE [=] 'string'
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | MAX_ROWS [=] value
  | MIN_ROWS [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value
  | TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
  | UNION [=] (tbl_name[,tbl_name]...)
}

partition_options:
    (see CREATE TABLE options)

issue reported in #1172 , this PR add [FIRST | AFTER column_name] support in MySQL alter table

Comment thread src/parser/mod.rs Outdated
let column_def = self.parse_column_def()?;

let mut column_position = None;
if dialect_of!(self is MySqlDialect) {
Copy link
Copy Markdown
Contributor Author

@xring xring Mar 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As per Contributing Guide, this is a dialect specific feature, shold also include GenericDialect here.

@xring xring force-pushed the feat-add-mysql-first-after-support-in-alter-table-column branch from 36505d4 to f52e326 Compare March 15, 2024 01:32
@xring xring force-pushed the feat-add-mysql-first-after-support-in-alter-table-column branch from f52e326 to c823970 Compare March 15, 2024 02:41
@xring
Copy link
Copy Markdown
Contributor Author

xring commented Mar 16, 2024

@andygrove Hi, could you please help approve the waiting workflow?

@coveralls
Copy link
Copy Markdown

coveralls commented Mar 16, 2024

Pull Request Test Coverage Report for Build 8308807027

Details

  • 131 of 131 (100.0%) changed or added relevant lines in 6 files are covered.
  • 2 unchanged lines in 1 file lost coverage.
  • Overall coverage increased (+0.07%) to 87.94%

Files with Coverage Reduction New Missed Lines %
src/ast/ddl.rs 2 84.89%
Totals Coverage Status
Change from base Build 8266982631: 0.07%
Covered Lines: 20615
Relevant Lines: 23442

💛 - Coveralls

@xring
Copy link
Copy Markdown
Contributor Author

xring commented Mar 16, 2024

Had some fix and running workflow locally with result:

codestyle

cargo +nightly fmt -- --check --config-path <(echo 'license_template_path = "HEADER"')
Warning: Unknown configuration option `license_template_path`

lint

cargo clippy --all-targets --all-features -- -D warnings
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s

compile

cargo check --all-targets --all-features
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s

test

all passed

@andygrove sorry but could you please help approve the workflow again?

@alamb alamb changed the title feat: add [FIRST | AFTER column_name] support in MySQL alter table Support [FIRST | AFTER column_name] support in ALTER TABLE for MySQL Apr 7, 2024
Copy link
Copy Markdown
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @xring -- this is a very nice contribution. I think it is well tested, documented and implemented 🙏

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 7, 2024

Sorry for the delay in reviewing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants