diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 149365c47..9b4d6b590 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -9002,7 +9002,15 @@ impl<'a> Parser<'a> { /// [ColumnOption::NotNull]. fn parse_column_option_expr(&mut self) -> Result { if self.peek_token_ref().token == Token::LParen { - let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_prefix())?; + let mut expr = self.with_state(ParserState::Normal, |p| p.parse_prefix())?; + expr = self.parse_compound_expr(expr, vec![])?; + loop { + let next_precedence = self.get_next_precedence()?; + if next_precedence == 0 || self.peek_token_ref().token == Token::Period { + break; + } + expr = self.parse_infix(expr, next_precedence)?; + } Ok(expr) } else { Ok(self.parse_expr()?) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 325e3939e..e8ce38829 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -512,6 +512,12 @@ fn parse_create_table_with_defaults() { } } +#[test] +fn parse_default_expr_parenthesized_then_cast() { + // Infix operators like :: after parenthesized expression in DEFAULT + pg().verified_stmt("CREATE TABLE t (c TEXT DEFAULT (foo())::TEXT)"); +} + #[test] fn parse_create_table_from_pg_dump() { let sql = "CREATE TABLE public.customer (