From a7bbc5e8bdc1f83772e10b0bf370904e21062457 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 25 Feb 2026 12:13:15 +0100 Subject: [PATCH] Add support for CREATE TABLE LIKE with defaults in PostgreSQL dialect --- src/dialect/postgresql.rs | 4 ++++ tests/sqlparser_postgres.rs | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/dialect/postgresql.rs b/src/dialect/postgresql.rs index 13bd82bfd..054b26cd9 100644 --- a/src/dialect/postgresql.rs +++ b/src/dialect/postgresql.rs @@ -292,4 +292,8 @@ impl Dialect for PostgreSqlDialect { fn supports_insert_table_alias(&self) -> bool { true } + + fn supports_create_table_like_parenthesized(&self) -> bool { + true + } } diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 510f6ccc5..c1593d0d5 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -593,6 +593,45 @@ fn parse_create_table_constraints_only() { }; } +#[test] +fn parse_create_table_like_with_defaults() { + let sql = "CREATE TABLE new (LIKE old INCLUDING DEFAULTS)"; + match pg().verified_stmt(sql) { + Statement::CreateTable(stmt) => { + assert_eq!( + stmt.name, + ObjectName::from(vec![Ident::new("new".to_string())]) + ); + assert_eq!( + stmt.like, + Some(CreateTableLikeKind::Parenthesized(CreateTableLike { + name: ObjectName::from(vec![Ident::new("old".to_string())]), + defaults: Some(CreateTableLikeDefaults::Including), + })) + ) + } + _ => unreachable!(), + } + + let sql = "CREATE TABLE new (LIKE old EXCLUDING DEFAULTS)"; + match pg().verified_stmt(sql) { + Statement::CreateTable(stmt) => { + assert_eq!( + stmt.name, + ObjectName::from(vec![Ident::new("new".to_string())]) + ); + assert_eq!( + stmt.like, + Some(CreateTableLikeKind::Parenthesized(CreateTableLike { + name: ObjectName::from(vec![Ident::new("old".to_string())]), + defaults: Some(CreateTableLikeDefaults::Excluding), + })) + ) + } + _ => unreachable!(), + } +} + #[test] fn parse_alter_table_constraints_rename() { match alter_table_op(