Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix MySQL parsing of GRANT, REVOKE, and CREATE VIEW #1538

Open
wants to merge 17 commits into
base: main
Choose a base branch
from

Conversation

mvzink
Copy link
Contributor

@mvzink mvzink commented Nov 20, 2024

  • Support MySQL style 'user'@'host' syntax.
  • Support wildcards on grant objects: *.*.
  • Make CASCADE/RESTRICT in revoke statements optional since MySQL doesn't accept it.
  • Support optional MySQL parameters for create view: algorithm, definer (requires user@host syntax), and security context.

This is needed for parsing MySQL-style `'user'@'host'` grantee syntax.

As far as I can tell, no dialect allows quotes or backticks as part of
an identifier (regardless of whether it starts with `@`) without other
specific syntax (e.g. nested in another quote style and thus not
starting with `@`), so this shouldn't adversely affect non-MySQL
dialects.
Introduces a new `Grantee` enum to differentiate bare identifiers (every
other database: `root`) from user/host pairs (MySQL: `'root'@'%'`).

While we're here, make the CASCADE/RESTRICT syntax for REVOKE optional
since Postgres doesn't require it and MySQL doesn't allow it.

Add support for MySQL wildcard object syntax: `GRANT ALL ON *.* ...`
@mvzink
Copy link
Contributor Author

mvzink commented Nov 20, 2024

Would appreciate feedback on the naming the MySQL-specific params types (would a generic/non-branded name be better?) and the API change for wildcard support (didn't want to change all 107 parse_object_name callsites for an option that is so niche, but happy to be convinced otherwise).

tests/sqlparser_mysql.rs Show resolved Hide resolved
tests/sqlparser_mysql.rs Show resolved Hide resolved
src/parser/mod.rs Outdated Show resolved Hide resolved
src/parser/mod.rs Outdated Show resolved Hide resolved
src/tokenizer.rs Show resolved Hide resolved
@@ -8353,20 +8409,40 @@ impl<'a> Parser<'a> {
}
}

/// Parse a possibly qualified, possibly quoted identifier, optionally allowing for wildcards,
/// e.g. *, `foo`.*, or "foo"."bar"
pub fn parse_object_name_with_wildcards(
Copy link
Contributor

Choose a reason for hiding this comment

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

The method sounds like what parse_wildcard_expr does, minus the return type. Can we reuse that functionality instead? e.g. if we move that logic out to its own method so that parse_wildcard_expr and other functionality like grant etc can call it directly?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Still having a think about the best way to do this; posting the other updates for further feedback.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sorry it's taken me a while to get to this. It's a bit tricky, partly because the expression form shouldn't accept *.*. I will try to come back to this later, but have had higher priorities the last few weeks and probably will until later in January. In my opinion, it might be better to avoid dragging on with more merge conflicts etc. and merge without this suggested refactor. Let me know your thoughts.

src/parser/mod.rs Outdated Show resolved Hide resolved
tests/sqlparser_mysql.rs Show resolved Hide resolved
tests/sqlparser_mysql.rs Outdated Show resolved Hide resolved
src/ast/mod.rs Outdated Show resolved Hide resolved
src/tokenizer.rs Show resolved Hide resolved
src/ast/mod.rs Outdated Show resolved Hide resolved
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.

2 participants