Skip to content

Commit 5ed4178

Browse files
Fix Postgres default parsing for pg_catalog.nextval(...) (#5802)
This fixes a small parsing gap in Postgres introspection. The parser already handled `nextval()`, but not schema-qualified calls like `pg_catalog.nextval()`. In some setups, the database can return the qualified form (not specified), so sequence defaults could be missed. This PR updates the parser to recognize both forms and adds a test. --------- Co-authored-by: jacek-prisma <malec@prisma.io>
1 parent 3187e39 commit 5ed4178

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

  • schema-engine/sql-schema-describer/src/postgres

schema-engine/sql-schema-describer/src/postgres/default.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,23 @@ fn parse_int_default(parser: &mut Parser<'_>) -> Option<DefaultValue> {
309309
parser.expect(Token::OpeningBrace)?;
310310
parser.expect(Token::ClosingBrace)?;
311311
Some(DefaultValue::unique_rowid())
312-
} else if s.eq_ignore_ascii_case("nextval") {
312+
} else {
313+
let is_nextval = if s.eq_ignore_ascii_case("nextval") {
314+
true
315+
} else if let Some(Token::Dot) = parser.peek_token() {
316+
// Accept schema-qualified function calls such as pg_catalog.nextval(...)
317+
parser.expect(Token::Dot)?;
318+
parser.expect(Token::Identifier).is_some_and(|name| {
319+
s.eq_ignore_ascii_case("pg_catalog") && name.eq_ignore_ascii_case("nextval")
320+
})
321+
} else {
322+
false
323+
};
324+
325+
if !is_nextval {
326+
return None;
327+
}
328+
313329
parser.expect(Token::OpeningBrace)?;
314330

315331
// Example: nextval(('"third_Sequence"'::text)::regclass)
@@ -351,8 +367,6 @@ fn parse_int_default(parser: &mut Parser<'_>) -> Option<DefaultValue> {
351367
eat_cast(parser)?;
352368

353369
Some(DefaultValue::sequence(sequence_name))
354-
} else {
355-
None
356370
}
357371
}
358372
_ => None,
@@ -727,6 +741,15 @@ mod tests {
727741
};
728742

729743
assert_is_sequence(r#"nextval('first_sequence'::regclass)"#, "first_sequence");
744+
assert_is_sequence(r#"pg_catalog.nextval('first_sequence'::regclass)"#, "first_sequence");
745+
assert!(
746+
get_default_value(
747+
r#"public.nextval('first_sequence'::regclass)"#,
748+
&ColumnType::pure(ColumnTypeFamily::Int, crate::ColumnArity::Required)
749+
)
750+
.unwrap()
751+
.is_db_generated()
752+
);
730753

731754
assert_is_sequence(r#"nextval('schema_name.second_sequence'::regclass)"#, "second_sequence");
732755

0 commit comments

Comments
 (0)