diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 57627b24e..6e1d3bf99 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1487,6 +1487,9 @@ pub enum AccessExpr { impl fmt::Display for AccessExpr { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { + AccessExpr::Dot(Expr::Value(value)) if matches!(value.value, Value::Number(_, _)) => { + write!(f, " . {value}") + } AccessExpr::Dot(expr) => write!(f, ".{expr}"), AccessExpr::Subscript(subscript) => write!(f, "[{subscript}]"), } diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 17f8343be..8887508a4 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -9853,6 +9853,17 @@ fn parse_alter_table_constraint_check_no_inherit() { pg_and_generic().verified_stmt("ALTER TABLE docs ADD CONSTRAINT c CHECK (id > 0) NO INHERIT"); } +#[test] +fn parse_compound_field_access_numeric_display() { + let sql = "SELECT * FROM t WHERE CASE WHEN a = 1 THEN b ELSE c END . 2"; + let mut statements = pg().parse_sql_statements(sql).unwrap(); + assert_eq!(statements.len(), 1); + let statement = statements.pop().unwrap(); + let displayed = statement.to_string(); + let reparsed = pg().parse_sql_statements(&displayed).unwrap(); + assert_eq!(vec![statement], reparsed); +} + #[test] fn parse_non_reserved_keywords_as_table_alias() { // PostgreSQL allows these keywords as explicit table aliases.