freshtonic commented on code in PR #1614: URL: https://github.com/apache/datafusion-sqlparser-rs/pull/1614#discussion_r1903356404
########## src/ast/mod.rs: ########## @@ -7278,16 +7279,126 @@ impl fmt::Display for SearchModifier { } } +/// A `LOCK TABLE ..` statement. MySQL and Postgres variants are supported. +/// +/// The MySQL and Postgres syntax variants are significant enough that they +/// are explicitly represented as enum variants. In order to support additional +/// databases in the future, this enum is marked as `#[non_exhaustive]`. +/// +/// In MySQL, when multiple tables are mentioned in the statement the lock mode +/// can vary per table. +/// +/// In contrast, Postgres only allows specifying a single mode which is applied +/// to all mentioned tables. +/// +/// MySQL: see <https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html> +/// +/// ```sql +/// LOCK [TABLE | TABLES] name [[AS] alias] locktype [,name [[AS] alias] locktype] +/// ```` +/// +/// Where *locktype* is: +/// ```sql +/// READ [LOCAL] | [LOW_PRIORITY] WRITE +/// ``` +/// +/// Postgres: See <https://www.postgresql.org/docs/current/sql-lock.html> +/// +/// ```sql +/// LOCK [ TABLE ] [ ONLY ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ] +/// ``` +/// Where *lockmode* is one of: +/// +/// ```sql +/// ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE +/// | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE +/// `````` #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] -pub struct LockTable { - pub table: Ident, +#[non_exhaustive] +pub enum LockTables { Review Comment: > None of this is a hill I will die on, but handling the burden of grammar differences in the parser and AST design means consuming the AST correctly in downstream projects will be easier. What I mean by this: When pieces of dialect-specific syntax are mixed in the same AST struct/enum variant the consumers have to understand the dialect-specific differences in order to know which fields they can safely ignore. At CipherStash I wrote a type-inferencer for SQL statements in order to determine if specific transformations can be performed safely. It uses `sqlparser`'s AST and there are a lot of cases where I had to spend time understanding which AST node fields or combinations of field values I can safely ignore when I'm only targeting Postgres. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org