Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions fuzz/fuzz_seeds/postgres_alter_extension.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ ALTER EXTENSION citext DROP FOREIGN TABLE public.ft;
ALTER EXTENSION citext ADD SEQUENCE public.seq;
ALTER EXTENSION citext DROP SCHEMA other;
ALTER EXTENSION citext DROP PROCEDURAL LANGUAGE plpgsql;
ALTER EXTENSION citext ADD ACCESS METHOD btree;
3 changes: 3 additions & 0 deletions src/ast/ddl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4926,6 +4926,8 @@ pub enum AlterExtensionOperation {
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub enum AlterExtensionMember {
/// `ACCESS METHOD object_name`
AccessMethod(Ident),
/// `FOREIGN TABLE object_name`
ForeignTable(ObjectName),
/// `[ PROCEDURAL ] LANGUAGE object_name`
Expand Down Expand Up @@ -4969,6 +4971,7 @@ impl fmt::Display for AlterExtensionOperation {
impl fmt::Display for AlterExtensionMember {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
AlterExtensionMember::AccessMethod(name) => write!(f, "ACCESS METHOD {name}"),
AlterExtensionMember::ForeignTable(name) => write!(f, "FOREIGN TABLE {name}"),
AlterExtensionMember::Language { procedural, name } => {
if *procedural {
Expand Down
4 changes: 3 additions & 1 deletion src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12539,7 +12539,9 @@ impl<'a> Parser<'a> {

/// Parse a member object of `ALTER EXTENSION ADD` or `ALTER EXTENSION DROP`
fn parse_alter_extension_member(&mut self) -> Result<AlterExtensionMember, ParserError> {
if self.parse_keywords(&[Keyword::FOREIGN, Keyword::TABLE]) {
if self.parse_keywords(&[Keyword::ACCESS, Keyword::METHOD]) {
Ok(AlterExtensionMember::AccessMethod(self.parse_identifier()?))
} else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::TABLE]) {
Ok(AlterExtensionMember::ForeignTable(
self.parse_object_name(false)?,
))
Expand Down
15 changes: 15 additions & 0 deletions tests/sqlparser_postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13528,6 +13528,7 @@ fn parse_case_ending_in_end_keyword_is_not_silently_dropped() {

fn alter_extension_member_round_trip_forms(action: &str) {
let sqls = [
format!("ALTER EXTENSION ext_name {action} ACCESS METHOD btree"),
format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE ft"),
format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE schema.ft"),
format!("ALTER EXTENSION ext_name {action} LANGUAGE plpgsql"),
Expand Down Expand Up @@ -13665,6 +13666,19 @@ fn parse_alter_extension_set_schema() {
fn parse_alter_extension_add_member() {
alter_extension_member_round_trip_forms("ADD");

match pg_and_generic().verified_stmt("ALTER EXTENSION ext_name ADD ACCESS METHOD btree") {
Statement::AlterExtension(AlterExtension { name, operation }) => {
assert_eq!(name, Ident::new("ext_name"));
assert_eq!(
operation,
AlterExtensionOperation::Add(AlterExtensionMember::AccessMethod(Ident::new(
"btree"
)))
);
}
other => panic!("unexpected statement: {other:?}"),
}

match pg_and_generic().verified_stmt("ALTER EXTENSION ext_name ADD PROCEDURAL LANGUAGE plpgsql")
{
Statement::AlterExtension(AlterExtension {
Expand Down Expand Up @@ -13700,6 +13714,7 @@ fn parse_alter_extension_add_member() {
}

for member in [
"ACCESS METHOD",
"FOREIGN TABLE",
"LANGUAGE",
"MATERIALIZED VIEW",
Expand Down
Loading